Oprócz rozmiaru.Jaka jest różnica między tablicą a literalną tablicą w Smalltalk?
Na przykład
|arr|. arr := Array new: 10
i
#(element1,element2, ...)
Oprócz rozmiaru.Jaka jest różnica między tablicą a literalną tablicą w Smalltalk?
Na przykład
|arr|. arr := Array new: 10
i
#(element1,element2, ...)
W obu postaciach tworzony obiekt ma być tego samego typu, z tymi samymi elementami. Główną różnicą jest to, że podczas korzystania z Array with:
otrzymujesz nową instancję za każdym razem, gdy kod jest wykonywany, z #()
otrzymujesz instancję utworzoną, gdy metoda jest akceptowana/kompilowana, tak że za każdym razem, gdy kod jest wykonywany, instancja tablicy jest to samo.
Rozważmy następujący kod:
doSomething
array := #(6 7 8).
Transcript show: array.
array at: 1 put: 3.
po raz pierwszy wykonać doSomething wszystko będzie normalnie. Drugi raz otrzymasz wydruk 3, 7, 8, ponieważ tablica jest taka sama, jak zmodyfikowano przy poprzednim wywołaniu metody.
Należy więc zachować ostrożność podczas używania literałów, a przede wszystkim pozostawiać je w przypadkach, w których nie zostaną zmutowane.
Rozważmy tę metodę w klasie przykład z instancją zmiennej próg:
Example >> #threshold
^threshold
Example >> #threshold: anInteger
threshold := anInteger
Example >> #initialize
threshold := 0
Example class >> #new
^super new initialize
Example >> testArraySum
| a |
a := #(4 8 10).
a sum > threshold ifTrue: [ a at: 1 put: a first - 2 ].
^a sum
Teraz, jeśli odczytać kod testArraySum, jeśli próg doesnt zmiany, należy zawsze retunr ten sam, shouldn' t to? Po rozpoczęciu ustawiania stałej wartości na a, a następnie odejmowania (lub nie, w zależności od progu, ale powiedzieliśmy, że została naprawiona) ustalonej kwoty, więc powinno być ... 20.
Cóż, jeśli oceniasz
Example new testArraySum
kilka razy, otrzymasz 20,18, 16 ... ponieważ tablica # (4 8 10) zostanie zmodyfikowana. Z drugiej strony,
Example >> testConstantArraySum
| a |
a := Array new: 3.
a at: 1 put: 4; at: 2 put: 8; at: 3 put: 10.
a sum > threshold ifTrue: [ a at: 1 put: a first - 2 ].
^a sum
jest naprawdę stały.
Należy zauważyć, że między elementami tablicy nie ma separatora między komórkami. Powyższy przykład zostanie przeanalizowany jako # (# element1 # ',' # element2 # ',' ...) –