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代码?
根据代码"做某事"的数量,你可以把它放在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代替最后一个方法.