[英]Ruby Closures: How to return args and block as a single argument to pass to a method
假設我有一個采用args和塊的方法:
def yield_if_widget(*args, &block)
if args[0].is_a?(Widget)
block.call
end
end
我可以使用參數和塊來調用此方法:
yield_if_widget(Widget.new) do
puts "I like widgets"
end
但是如果我有另一個方法來准備參數和塊呢?
def widget_and_block
args = [Widget.new]
block = proc{ puts "I like widgets" }
[args, block]
end
我希望能夠將它直接傳遞給第一個方法:
yield_if_widget(*widget_and_block)
這可能嗎? 怎么樣? 假設yield_if_widget
是在庫中定義的並且猴子修補它不是一個選項。
為了讓ruby明白方法調用中的參數是一個塊,一個商業廣告,必須放在它前面。
def widget_and_block
args = [Widget.new]
block = proc{ puts "I like widgets" }
[args, block]
end
wab = widget_and_block
# ⇓
yield_if_widget(*wab.first, &wab.last)
Oneliner(它不會返回yiw
返回的內容):
widget_and_block.tap { |args, cb| yield_if_widget *args, &cb }
UPD基本上,方法調用中的&符號用於表示“嘿,將其轉換為proc並將其用作代碼塊”到ruby。 它是語言的語法部分,就像你必須將數組內容放在方括號內,而不是卷曲。 這就是為什么源代碼中應該存在&符號的原因。
另一方面,您是否可以自由修改yield_if_widget
並從參數列表中刪除&符號 :
-def yield_if_widget(*args, &block)
+def yield_if_widget(*args, block)
代碼將按預期工作,因為proc實例作為最后一個參數傳遞,並且很自然地允許call
它。
還請注意,將&符號添加到方法調用的最后一個參數強制在其上調用#to_proc
方法,如:
[1,2,3].reduce &:+
#⇒ 6
上面的魔法是有效的,因為Symbol
類有它自己的#to_proc
方法實現。
你不能一行(據我所知)。 你需要臨時變量。
給出這些方法:
def prepare
return [4, proc { puts "called" }]
end
def run(a, &block)
puts a
block.call
end
您可以將prepare
的返回值傳遞給您的方法,如下所示:
i,blk = prepare()
run(i, &blk)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.