Как динамически обернуть код внутри блока в Ruby? - PullRequest
1 голос
/ 12 февраля 2012

Предположим, что определенная часть кода должна выполняться внутри другого блока / контекста, в зависимости от параметра конфигурации. Например,

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

Есть ли способ написать это, не повторяя код # do something?

1 Ответ

5 голосов
/ 12 февраля 2012

В зависимости от того, сколько кода «сделать что-то», вы можете выбросить его в лямбду:

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

Или вы можете использовать целые классы или просто лямбды вместо методов в этом последнем.

...