1

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

def one(&block)
  two(block)
end

def two(&block)
  block.call
end

在实际代码中,传递了其他参数,并且one是语法糖two

我希望能够同时调用onetwo使用块。

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

我可以明白为什么我得到ArgumentError,two不需要这样的论点。我不太确定如何表达这一点,但&block指定块出现在传入的参数之后,因此出现错误。

红宝石 1.9

4

2 回答 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?

于 2013-03-28T13:57:20.933 回答
2

你可以这样做yield

def one
  two { yield }
end

def two
  yield
end
于 2013-03-28T14:11:27.687 回答