除了块之外,我有两种方法,但是其中一种方法需要将其块传递给另一种方法。
def one(&block)
two(block)
end
def two(&block)
block.call
end
在实际代码中,传递其他参数,one
是two
上的语法糖。
我希望能够用块来调用one
和two
。
one { } # => okay
two { } # => ArgumentError: wrong number of arguments (1 for 0)
我可以看到为什么我得到ArgumentError
,two
没有这样的论点。我不太确定如何表达这个,但&block
指定块在传入参数后出现,因此错误。
Ruby 1.9
您可以将&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?
来检查块是否给出
你可以用yield
做同样的事情:
def one
two { yield }
end
def two
yield
end