Вот Bar#do_things
:
class Bar
def do_things
Foo.some_method(x) do |x|
y = x.do_something
return y_is_bad if y.bad? # how do i tell it to stop and return do_things?
y.do_something_else
end
keep_doing_more_things
end
end
И вот Foo#some_method
:
class Foo
def self.some_method(targets, &block)
targets.each do |target|
begin
r = yield(target)
rescue
failed << target
end
end
end
end
Я думал об использовании рейза, но я пытаюсь сделать его общим, поэтому я не хочу добавлять что-то конкретное Foo
.
next
,break
,return
, Вы не можете сравниватьnext
илиbreak
с аргументом.redo
, которое в основном просто перемещает выполнение обратно в верхнюю часть блока в текущей итерации.Я хотел просто иметь возможность вырваться из блока - что-то вроде прямого перехода, на самом деле не связанного с циклом. На самом деле, я хочу разорвать блок, находящийся в цикле, не прерывая цикл. Для этого я сделал блок одно-итерационным циклом:
Надеюсь, это поможет следующему гуглеру, который приземлится здесь, основываясь на теме.
источник
Если вы хотите , чтобы ваш блок , чтобы вернуть полезное значение (например , при использовании
#map
,#inject
и т.д.),next
аbreak
также принимает аргумент.Учтите следующее:
Эквивалент с использованием
next
:Конечно, вы всегда можете извлечь необходимую логику в метод и вызвать ее из своего блока:
источник
break
!break
(возможно, просто замените один из вашихnext
наbreak
..break something
работает,break(something)
работает, ноtrue && break(somehting)
выдает синтаксическую ошибку. Просто к вашему сведению. Если условие необходимо, тоif
илиunless
нужно использовать.используйте ключевое слово
break
вместоreturn
источник
Возможно, вы можете использовать встроенные методы для поиска определенных элементов в массиве вместо
each
-ingtargets
и делать все вручную. Несколько примеров:Один пример будет делать что-то вроде этого:
источник
next
и,break
кажется, сделать правильную вещь в этом упрощенном примере!выход: 1 3 4 5 6 7 8
источник
Чтобы вырваться из рубинового блока просто используйте
return
ключевое словоreturn if value.nil?
источник
return
выходит из функции?