def show a, &b
yield a
end
show 1 {|x| puts x}
但是没有& b在定义中,代码也有效,所以我想知道在什么情况下,& b是必需的?为什么要在Ruby的方法定义中添加&b参数?
def show a, &b
yield a
end
show 1 {|x| puts x}
但是没有& b在定义中,代码也有效,所以我想知道在什么情况下,& b是必需的?为什么要在Ruby的方法定义中添加&b参数?
块通常是一个方法的匿名参数。在大多数情况下,您在方法中使用yield来执行块。有两种情况产量不足:
•您想将块传递给另一种方法。
•您想将块转换为Proc。
在这两种情况下,您都需要通过名称来引用您的块。要做到这一点,你需要附加一个参数(最后总是说明)并使用&作为该参数的前缀。
对于第一种情况,
def math(a, b)
yield(a, b)
end
def teach_math(a, b, &operation)
puts "Let's do the math:"
puts math(a, b, &operation)
end
teach_math(2, 3) {|x, y| x * y}
# Output
# Let's do the math:
# 6
对于第二种情况,(当你需要转换为PROC)
def my_method(&the_proc)
the_proc
end
p = my_method {|name| "Hello, #{name}!" }
puts p.class
puts p.call("Bill")
# Output
# Proc
# Hello, Bill!
&b
用于当您想要将该块捕获为Proc
以供稍后存储或调用时使用。 yield
只能用于在当前方法中调用。 &b
对于更高级的迭代器和方法很有用。
很好的例子,第一个真正回答我的问题 – mko 2012-03-13 02:44:24