Założenie, że wysłanie do pustego bloku metody value zwraca nil.
Pusty blok w większości popularnych implementacji Smalltalka zwraca nil po wysłaniu do niego metody value, tzn.
[] value - wynikiem wykonania tego kodu będzie nil.
Dlatego też spotyka się nieraz następujące konstrukcje:
value := myCollection detect: [:each | each = myObject ] ifNone: [].
|
oraz
value := someBoolean ifTrue: ['some object'] ifFalse: [].
|
W przypadku nieznalezienia żądanego objektu w pierwszym przykładzie lub gdy zmienna someBoolean ma wartość false w drugim przykładzie, wtedy zmiennej value przypisana zostanie wartość nil.
Zwracanie nil przez pusty blok po wysłaniu do niego metody value nie jest jednak regułą. Projekt standardu ANSI przewiduje w tym wypadku zwrócenie nieokreślonej wartości, tzn. wartość ta nie musi być wcale nil.
Dlatego, aby uniezależnić się od aktualnej implementacji bloku i zapewnić pełną przenośność kodu lepiej jest pisać:
value := myCollection detect: [:each | each = myObject ] ifNone: [nil].
|
oraz
value := someBoolean ifTrue: ['some object'] ifFalse: [nil].
|
Z drugiej jednak strony obecnie popularne środowiska Smalltalk zwracają w takim przypadku nil, tak więc użycie drugiego sposobu zapisu nie jest w większości zastosowań konieczne dla zachowania przenośności kodu.
(pn)
|