s = Proc.new {|x|x*2}
puts "proc:" + (s.call(5)).to_s
def foo(&a)
a.call(5)
end
foo{|x| puts "foo:" + (x*3).to_s}
运行此程序会产生输出:
proc:10
foo:15
如何将foo块中的值3传递给proc? 我预计此输出:
proc:10
foo:10
始终使用值5作为参数调用proc,因为foo定义为:
a.call(5)
为什么foo 15在输出中?
答案 0 :(得分:4)
因为块输出x*3
(而不是返回x*2
的s)和5*3
是15。
答案 1 :(得分:4)
值3未传递给proc,因为您没有将s
传递给foo
。你可能想写
foo {|x| puts "foo: #{s.call(x)}"}
或
puts "foo: #{foo(&s)}"
此外,这些是等效的:
def foo_1(x, &a)
puts a.call(x)
end
def foo_2(x)
puts yield(x)
end
foo_1(5, &s) #=> 10
foo_2(5, &s) #=> 10