def test(args,&block)
yield
end
test 1, {puts "hello"}
最后一行不起作用。如何使用其他参数传递块?
答案 0 :(得分:3)
test(1){ puts "hello" }
或
test(1) do
puts "hello"
end
或
blk = proc{ puts "hello" }
test(1, &blk)
您可以查看此https://pine.fm/LearnToProgram/chap_10.html
正如@Cary Swoveland建议我们可以稍微深入一点。
任何Ruby方法都可以隐式接受一个块。即使您没有在方法签名中定义它,您仍然可以捕获它并进一步传递。
因此,考虑到这个想法,我们可以使用您的方法进行以下操作:
def test(args, &block)
yield
end
与
相同def test(args)
yield
end
与
相同def test(args)
block = Proc.new
block.call
end
如果你有这个隐式的块捕获,你可能想要添加额外的检查:
def test(args)
if block_given?
block = Proc.new
block.call
else
"no block"
end
end
或
def test(args)
if block_given?
yield
else
"no block"
end
end
所以调用这些方法将返回以下内容:
test("args")
#=> no block
test("args"){ "Hello World" }
#=> "Hello World"