2013-03-28 56 views
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) 

我明白为什么我得到了ArgumentErrortwo没有参数本身。我不太确定如何说明这一点,但&block指定在传入参数后出现的块,因此出现错误。

Ruby 1.9的

回答

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?

+0

谢谢 - 我使用了两个(&block)'我没有意识到你可以保留'&'将块作为非参数参数传递...... – Kris

2

给予你可以做同样的yield

def one 
    two { yield } 
end 

def two 
    yield 
end