Ruby 如何在方法之间传递块?

Ruby 如何在方法之间传递块?,ruby,Ruby,我有两个方法,除了一个块之外,它们都可以,但是其中一个方法需要将它的块传递给另一个 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)

我有两个方法,除了一个块之外,它们都可以,但是其中一个方法需要将它的块传递给另一个

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

它将具有与上述相同的输出。请注意,如果没有给一个块,它将引发一个
参数错误:尝试创建没有块的Proc对象
,因此您必须通过调用
if block\u gived?
来检查该块是否已给出。您可以将
&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

它将具有与上述相同的输出。请注意,如果没有给一个块,它将引发一个
参数错误:尝试创建没有块的Proc对象
,因此您必须通过调用
if block\u gived?
来检查该块是否已给出。您可以对
yield
执行相同的操作:

def one
  two { yield }
end

def two
  yield
end

您可以对
收益率
执行相同的操作:

def one
  two { yield }
end

def two
  yield
end
谢谢-我使用了
two(&block)
我不知道你可以保留
&
作为非参数参数传递块…谢谢-我使用
two(&block)
我不知道你可以保留
&
作为非参数传递块。。。