В зависимости от того, сколько кода «сделать что-то», вы можете выбросить его в лямбду:
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
Или вы можете использовать целые классы или просто лямбды вместо методов в этом последнем.