簡體   English   中英

(可選)在Ruby中調用一個塊

[英]Optionally calling a block in ruby

我有兩種方法可能需要使用一個塊來調用一些代碼。

選項1:

foo()

選項2:

block_function do 
  foo()
end

如何在運行時在這兩者之間切換? 我真的不想執行以下操作,因為foo()實際上是很多代碼:

if condition then
    foo()
else
    block_function do 
      foo()
    end
end
def condition_or_block_function
  if condition
    yield
  else
    block_function { yield }
  end
end

condition_or_block_function do
  foo() # which is really a lot of code :)
end

或者像其他人所建議的那樣,使foo()一堆代碼成為實際方法,並編寫您在OP中編寫的內容。

@tadman建議的更通用的版本:

def condition_or_block condition, block_method, *args
  if condition
    yield
  else
    send(block_method, *args) { yield }
  end
end

condition_or_block(some_condition, some_block_yielding_method) do
  foo() # which is really a lot of code :)
end

@Christian Oudard添加了說明特定問題的注釋,可以選擇使用div do ... end與Erector裝飾代碼塊。 這表明了另一種方法:

class BlockWrapper
  def initialize(method=nil)
    @method = method
  end
  def decorate
    @method ? send(method) { yield } : yield
  end
end

wrapper = BlockWrapper.new( condition ? nil : :div )

wrapper.decorate do
  #code block
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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