如何使用其他参数传递块?

时间:2016-11-22 15:44:10

标签: ruby yield

def test(args,&block)
  yield
end

test 1, {puts "hello"}

最后一行不起作用。如何使用其他参数传递块?

1 个答案:

答案 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"