如何在Ruby中的块内动态包装代码?

use*_*029 1 ruby block dynamic

假设代码的某一部分需要在不同的块/上下文中运行,具体取决于配置选项.例如,

if silence
  silence_stdout do
    # do something
  end
else
  # do the same thing
end
Run Code Online (Sandbox Code Playgroud)

有没有办法写这个而不重复# do something代码?

mu *_*ort 5

根据代码"做某事"的数量,你可以把它放在lambda中:

something = -> { do_something }
if silence
  silence_stdout &something
else
  something.call
end
Run Code Online (Sandbox Code Playgroud)

或者把它扔进一个方法:

def something
  # Do something, lots and lots of something.
end

if silence
    silence_stdout &method(:something)
else
    something
end
Run Code Online (Sandbox Code Playgroud)

你也可以将逻辑内部改写一下:

def no_op
  yield
end
def silence_stdout
  # Do whatever and then...
  yield
end

m = method(silence ? :no_op : :silence_stdout)
m.call do
  # Do something
end
Run Code Online (Sandbox Code Playgroud)

或者你可以使用整个类或lambda代替最后一个方法.