为什么有时我应该在接受块的函数中使用block和其他时候&block?
发布于 2009-09-06 18:20:35
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
将proc作为块传递给方法,这样就可以像使用块一样使用procs。
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)
变量名block
并没有什么特别的含义。如果你愿意,你可以使用&strawberries
,“&”是这里的关键。
您可能会发现this article很有帮助。
发布于 2009-09-06 18:23:19
在参数列表中,&whatever
获取传递给方法的块,并将其包装在Proc对象中。Proc存储在一个名为whatever
的变量中(当然,它可以是您在与号后面键入的任何名称-通常是“块”)。在方法调用之后,&whatever
语法将进程转换为块。所以如果你像这样定义一个方法:
def thing(&block)
thing2 &block
end
您正在定义一个方法,该方法接受一个块,然后使用该块调用另一个方法。
发布于 2009-09-06 18:30:09
如果不设置& before块,Ruby将无法识别它与传递给函数的“块”的关系。这里有一些例子。
def f(x, block); end
f(3) { 2+2 } # gives an error, because "block" is a
# regular second argument (which is missing)
def g(x, &block); end
g(3) { 2+2 } # legal
def h(x); end
h(3) { 2+2 } # legal
为了以后在函数中使用:
def x(&block) # x is a 0 param function
y(block) # y is a 1 param function (taking one "Proc")
z(&block) # z is a 0 param function (like x) with the block x received
end
所以,如果你调用z(&block)
,它是(差一点!)与调用z { yield }
相同:只需将块传递给下一个函数。
https://stackoverflow.com/questions/1386276
复制相似问题