在ruby中,“& block”有什么作用?

时间:2012-12-01 00:12:22

标签: ruby

  

可能重复:
  What’s this &block in Ruby? And how does it get passes in a method here?

我不了解&block部分,它做了什么?

这是一个例子:

def method_missing(method_name, *args, &block)
  @messages << method_name
  @object.send method_name, *args, &block
end

4 个答案:

答案 0 :(得分:5)

Blocks让您有机会声明回调以传递给方法。

&在这里是关键 - 就像@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.

答案 1 :(得分:4)

回答“我将如何将其传递给另一种方法?” 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可以传递给任何方法,例如mapreduce,任何内容。

然而,如果你不需要将块传递给另一种方法,你可以简单地使用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]

愿力量与你同在。

答案 2 :(得分:3)

它将块转换为可以传递给另一个方法的proc对象。

答案 3 :(得分:1)

当您使用块调用方法时,有两种方法可以使用该块:

  • 在方法
  • 中调用yield
  • 通过将Proc添加到其中来将其转换为&对象

用第二种方法可以将它传递给另一种方法。

因此,在您的情况下,它会将给定的块转换为Proc并使用它来调用method_name

想到它,因为你可以像任何一个论点一样传递一个块。