簡體   English   中英

Ruby閉包:如何將args和block作為單個參數返回以傳遞給方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM