2012-03-13 54 views

回答

6

块通常是一个方法的匿名参数。在大多数情况下,您在方法中使用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! 
+0

很好的例子,第一个真正回答我的问题 – mko 2012-03-13 02:44:24

1

&b用于当您想要将该块捕获为Proc以供稍后存储或调用时使用。 yield只能用于在当前方法中调用。 &b对于更高级的迭代器和方法很有用。

相关问题