2017-02-10 14 views

Odpowiedz

5

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.

3

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.

Powiązane problemy