Я пытаюсь определить DSL, в котором правила (для этого примера правила определяют, является ли что-то "хорошим" или "плохим") указаны в блоке в Ruby. Ниже приведена (чрезвычайно упрощенная) версия того, что я хочу сделать:
def test_block
# Lots of other code
is_good = yield # ... should give me true or false
# Lots of other code
end
test_block do
good if some_condition
good if some_other_condition
bad
end
Есть ли способ определить методы good
и bad
, которые делают разрыв блока? В приведенном выше примере я хочу:
- проверить, является ли some_condition истиной, и если это так, выйти из блока и вернуть ему значение true
- проверить, является ли some_other_condition истиной, и если это так, выйти из блока и вернуть ему значение true
- возвращает false из блока безоговорочно, если мы все еще в нем
т.е. Я хочу, чтобы приведенный выше код вел себя так, как будто я написал блок следующим образом:
result = test_block do
break true if some_condition
break true if some_other_condition
break false
end
Вставка break
в определение метода хороший / плохой, очевидно, не работает. Есть ли какой-то другой способ достичь желаемого результата или мне следует подумать о совершенно ином способе достижения этой цели?