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

时间:2012-02-12 04:58:17

标签: ruby dynamic block

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

if silence
  silence_stdout do
    # do something
  end
else
  # do the same thing
end

有没有办法在不重复# do something代码的情况下编写此代码?

1 个答案:

答案 0 :(得分:5)

取决于代码和#34;执行某些操作"你可以把它扔进lambda:

something = -> { do_something }
if silence
  silence_stdout &something
else
  something.call
end

或将其扔进方法:

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

if silence
    silence_stdout &method(:something)
else
    something
end

你也可以把逻辑内部转一点:

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

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