2013-03-28 91 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