如何在方法之间传递块?

时间:2013-03-28 13:53:31

标签: ruby

我有两种方法,除了块之外,其中一种方法需要将其块传递给另一种方法。

def one(&block)
  two(block)
end

def two(&block)
  block.call
end

在实际代码中传递其他参数,onetwo上的语法糖。

我希望能够用块调用onetwo

one { } # => okay
two { } # => ArgumentError: wrong number of arguments (1 for 0)

我可以看到为什么我得到ArgumentErrortwo没有这样的论点。我不太确定如何对此进行短语,但&block指定在传入的参数后出现块,因此出错。

Ruby 1.9

2 个答案:

答案 0 :(得分:2)

您可以将&block传递给第二种方法,如下所示:

def one(&block)
  two(&block)
end

def two(&block)
  block.call
end

one { puts "Hello World" }
Hello World
#=> nil

<强>更新

你也可以这样做

def one
  two(&Proc.new)
end

def two(&block)
  block.call
end

它将具有与上面相同的输出。请注意,如果没有给出一个块,它将引发ArgumentError: tried to create Proc object without a block,因此您必须通过调用if block_given?

来检查是否给出了阻止

答案 1 :(得分:2)

您可以对yield执行相同的操作:

def one
  two { yield }
end

def two
  yield
end