在ruby中,什么是&;块;做
可能重复:在ruby中,什么是&;块;做,ruby,Ruby,可能重复: 我不理解&block部分,它是做什么的 以下是一个例子: def method_missing(method_name, *args, &block) @messages << method_name @object.send method_name, *args, &block end def method_缺少(method_名称、*args和block) @消息块使您有机会声明要传递给方法的回调 和在这里是键,就像前面提到的@pst一样,
我不理解
&block
部分,它是做什么的
以下是一个例子:
def method_missing(method_name, *args, &block)
@messages << method_name
@object.send method_name, *args, &block
end
def method_缺少(method_名称、*args和block)
@消息块
使您有机会声明要传递给方法的回调
和
在这里是键,就像前面提到的@pst一样,它将块“升级”到Proc,并将Proc绑定到具有给定名称的变量
与和
def time(&block)
puts block
end
time
# => nil
time { foo }
# => #<Proc:0x00029bbc>
def time(block)
puts block
end
time { foo }
# => ArgumentError: wrong number of arguments (0 for 1)
# Because & isn't included, the method instead expected an arguement,
# but as a block isn't a arguement an error is returned.
它将块转换为可传递给另一个方法的proc对象。当使用块调用方法时,有两种方法可以使用该块:
- 调用
yield
内部方法
- 通过在
&
前面加上前缀,将其转换为Proc
对象
使用第二种方法,您可以将其传递给另一个方法
因此,在您的例子中,它将给定的块转换为Proc
,并用它调用method\u name
想象一下,你可以像传递任何参数一样传递一个块。回答“我如何将它传递给另一个方法?”Brian的评论:
像这样:
def compose init_value, n=2, &b
if n==0 then init_value else
b.call( compose init_value, n - 1, &b )
end
end
compose 2 do |n| n * n end
#=> 16
compose 2, 4 do |n| n * n end
#=> 65536
compose 2, 4 do |n| n * 0.5 end
#=> 0.125
这是一种递归方法,它将同一块递归地应用于一个数多次。在这里,打包到b
参数中的块被调用,但同时它被递归地传递到compose
方法,而n
参数递减1。同样地,b
可以传递给任何方法,如map
,reduce
,任何方法
然而,如果您不需要将块传递给另一个方法,您可以简单地使用yield
:
def apply_block_to_1_2_3
return yield( 1 ), yield( 2 ), yield( 3 )
end
apply_block_to_1_2_3 { |n| n * n }
#=> [1, 4, 9]
愿原力与你同在。Daniel,请你展示一个代码示例好吗?这是一个简单的文字解释,在给定的上下文中是足够的,除了有一种替代方法提供一个块作为参数,我不知道,“&”实际上不会将一个块“升级”到一个进程,相反。。。它将现有的进程转换为一个块,因此获取块的方法可以使用它们!(Proc只是一个“已保存”的块),因此您可以创建它:my_Proc=Proc.new{| x |··························。。。然后你可以在一个需要一个块的方法中使用它:@my_collection.each(&my_proc)slivu,你能给我展示一个代码示例吗?好的,最后一行对我来说稍微亮了一点!我如何将它传递给另一种方法?继续学习,布莱恩,我们在这里为你:)谢谢你的支持鲍里斯!:)对不起,我还是不明白。。。另外,我花了30分钟分析你的代码。。。(…我是Ruby新手…)你能展示一些更简单的东西吗?Brian,这很简单。可以想象,您可以在评论中准确地指出您不理解的内容,但坦率地说,如果您在获取此基本代码方面遇到困难,我建议您从开始,然后继续学习Zed Shaw的“艰苦学习Ruby”。