Ruby中block和&block之间的区别?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (73)

block和&block的区别是什么?

提问于
用户回答回答于

block只是一个局部变量,&block是对传递给该方法的块的引用。

def foo(block = nil)
  p block
end

foo # => nil
foo("test") # => test
foo { puts "this block will not be called" } # => nil

def foo(&block)
  p block
end

foo # => nil
foo("test") # => ArgumentError: wrong number of arguments (1 for 0)
foo { puts "This block won't get called, but you'll se it referenced as a proc." }
# => #<Proc:0x0000000100124ea8@untitled:20>

也可以使用&block调用方法时传递一个进程作为一个块的方法。

my_proc = proc {|i| i.upcase }

p ["foo", "bar", "baz"].map(&my_proc)
# => ["FOO", "BAR", "BAZ"]

p ["foo", "bar", "baz"].map(my_proc)
# => ArgumentError: wrong number of arguments (1 for 0)

用户回答回答于

在参数列表中,&whatever将传递给该方法的块取回到Proc对象中。Proc被存储在一个变量中whatever(当然,通常它是“block”),这个变量可以是你在&符号之后键入的任何名字。在方法调用之后,&whatever语法将Proc变成块。所以如果你像这样定义一个方法:

def thing(&block)
  thing2 &block
end

你正在定义一个方法,它需要一个块,然后用该块调用另一个方法。

扫码关注云+社区