Ruby中的&(和号)用于处理和调用方法的目的
发布时间:2020-12-16 19:54:39 所属栏目:百科 来源:网络整理
导读:我注意到很多关于 Ruby Procs的例子有以下的象征在它 # Ruby Exampleshout = Proc.new { puts 'Yolo!' }def shout_n_times(n,callback) n.times do callback.call endendshout_n_times(3,shout)# prints 'Yolo!' 3 times 我的问题是符号?看来,如果我写了没
我注意到很多关于
Ruby Procs的例子有以下的&象征在它
# Ruby Example shout = Proc.new { puts 'Yolo!' } def shout_n_times(n,&callback) n.times do callback.call end end shout_n_times(3,&shout) # prints 'Yolo!' 3 times 我的问题是&符号?看来,如果我写了没有& amp;相同的确切代码,它的工作原理: # Same code as previous without & shout = Proc.new { puts 'Yolo!' } def shout_n_times(n,callback) n.times do callback.call end end shout_n_times(3,shout) # prints 'Yolo!' 3 times 解决方法
This article提供了很好的差异概述.
为了总结这篇文章,Ruby允许隐式和显式的块.此外,Ruby具有block,proc和lambda. 你打电话时 def foo(block) end 块只是方法的简单参数.参数在变量块中引用,并且如何与它进行交互取决于您传递的对象的类型. def foo(one,block,two) p one p block.call p two end foo(1,2,3) 1 NoMethodError: undefined method `call' for 2:Fixnum from (irb):3:in `foo' from (irb):6 from /Users/weppos/.rvm/rubies/ruby-2.1.5/bin/irb:11:in `<main>' foo(1,Proc.new { 1 + 1 },3) 1 2 3 但是当你使用&符号在方法定义中,块具有不同的含义.您正在明确定义一个接受块的方法.并且其他规则将适用(例如每个方法不超过一个块). def foo(one,two,&block) p one p block.call p two end 首先,作为一个块,方法签名现在接受“两个参数和一个块”,而不是“三个参数”. foo(1,Proc.new { "from the proc" }) ArgumentError: wrong number of arguments (3 for 2) from (irb):7:in `foo' from (irb):12 from /Users/weppos/.rvm/rubies/ruby-2.1.5/bin/irb:11:in `<main>' 这意味着,您必须强制第三个参数是将参数与&符号传递的块. foo(1,&Proc.new { "from the proc" }) 1 "from the proc" 2 但是,这是一个非常不寻常的语法.在Ruby中,具有块的方法通常使用{} foo(1,2) { "from the block" } 1 "from the block" 2 或者做结束. foo(1,2) do "from the block" end 1 "from the block" 2 我们回到方法定义.我之前提到以下代码是一个显式的块声明. def foo(one,&block) block.call end 方法可以隐式接受一个块.隐性块被称为产量. def foo(one,two) p yield end foo(1,2) { "from the block" } 可以使用block_given检查块是否通过? def foo(one,two) if block_given? p yield else p "No block given" end end foo(1,2) { "from the block" } => "from the block" foo(1,2) => "No block given" 如果您将“块”声明为简单参数(因此没有&符号),则这些块相关功能将不可用,因为它只是一个无效的方法参数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- xml是什么?什么是XML?XML有什么用处?xml可以用来做什么?
- c#?:带参数的运算符
- HDU 3449 Consumer 依赖背包 入门题
- 加密 – React-Native加密:如何在React-Native中生成HMAC?
- React Native开源项目-嘎嘎商城客户端(持续更新中)
- 【iOS开发-网络】两种常用的方法解析XML数据
- swift – UICollectionview scrollToItemAtIndexPath,在动画
- 分页技术原理与实现之Java+Oracle代码实现分页(二)
- iphone – 任何人都有关于如何使用XCode 4.2创建通用应用程
- NOR flash和Nand Flash的区别