Нет ничего похожего на выражение охраны - blah ifTrue: [^ foo]
- внутри блока, потому что ^
является нелокальным возвращением, возвращаемым из метода, вызывающего блок, а не из самого блока.
Большие блоки- как большие вещи - должны быть реорганизованы в меньшие, более понятные / поддающиеся обработке части, но иногда это не всегда возможно.Я имею в виду этот ответ, чтобы предложить варианты вариантов, когда вы не можете действительно упростить обычными способами.
Если ваш блок действительно настолько сложен, и вы не можете сделать его проще (например, разделение ее на части делокализует информацию слишком много), тогда, возможно, вы можете использовать явное возвращаемое значение.В частности, если ваш блок не возвращает nil
, вы могли бы сделать что-то вроде
[:one :two | | result |
result := (one isNil and: [two isNil]) ifTrue: [false].
result ifNil: ["do one thing, possibly setting result"].
result]
Если ваш блок может вернуть nil
, вам понадобится другое значение Sentinel:
[:one :two | | result marker |
result := marker := Object new.
(result == marker) ifTrue: ["do one thing, possibly setting result"].
result]
Наконец, - и я не решаюсь предложить это - вы могли бы сделать это:
[1 + 2.
thisContext return: 5.
3 + 4] value
, который возвращает 5
.
(Проверка того, как это взаимодействует с ^
и встроенными селекторамикак #ifTrue:ifFalse:
оставлено в качестве упражнения для читателя.)