如何在方法之间传递块?

问题描述 投票:1回答:2

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

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

ruby
2个回答
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?来检查块是否给出


2
投票

你可以用yield做同样的事情:

def one
  two { yield }
end

def two
  yield
end
© www.soinside.com 2019 - 2024. All rights reserved.