我注意到很多关于
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"