Kiedy zmienne w Ruby decydują o tym, czy utrzymać nowe odniesienie? - rubin

Nauczyłem się, że w Ruby zmienne zawierają odniesienia do obiektów, a nie same obiekty. Na przykład:

a = "Tim"
b = a
a[0] = "J"

Następnie za i b oba mają wartość "Jim".

Jednak jeśli zmienię trzecią linię na

a = "Jim"

Następnie a == Jim i b == Tim

Zakładam, że oznacza to, że zmieniony przeze mnie kod utworzył nowe odniesienie za.

Dlaczego więc zmiana litery lub zmiana całego łańcucha robi tak wiele różnic?

Pytanie uzupełniające: Czy Java działa w ten sam sposób?

Dziękuję Ci.

Odpowiedzi:

4 dla odpowiedzi № 1

Jedyną rzeczą do nauczenia się tutaj jest różnica między zadanie i wywołanie metody.

a = "Jim"

to zadanie. Tworzysz nowy obiekt typu string (literał "Jim") i przypisz go do zmiennej a.

Z drugiej strony,

a[0] = "J"

jest wywołanie metody na obiekcie, do którego już odwołuje się zmienna a. Wywołanie metody nie może zastąpić obiektu, do którego odwołuje się zmienna, innym, może po prostu zmienić stan wewnętrzny obiektu i / lub zwrócić inny obiekt.


3 dla odpowiedzi № 2

Uważam, że takie rzeczy są najłatwiejsze do zrozumienia za pomocą IRB:

>> a = "Tim"
=> "Tim"
>> a.object_id
=> 2156046480
>> b = a
=> "Tim"
>> b.object_id
=> 2156046480
>> a.object_id == b.object_id
=> true

Jak widzisz a i b mieć to samo object_id, co oznacza, że ​​odnoszą się do tego samego obiektu. Więc kiedy zmieniasz jedną, zmieniasz drugą. Teraz przypisz coś nowego a:

>> a = "Jim"
=> "Jim"
>> a.object_id
=> 2156019520
>> b.object_id
=> 2156046480
>> a.object_id == b.object_id
=> false

Ty zrobiłeś a wskaż nowy obiekt, podczas gdy b nadal zachował stary odnośnik. Zmiana któregokolwiek z nich teraz nie zmieni drugiego.


1 dla odpowiedzi nr 3

Kiedy to zrobisz a[0] = "J", pytasz

Zmień pierwszy znak obiektu, do którego się odwołuje a (który jest taki sam jak b) do "J"

Podczas gdy ty to robisz a = "Jim", przydzielasz całkowicie nowe odwołanie do obiektu (ciąg znaków "Jim") do a. b nie ma wpływu, ponieważ nie zmieniasz niczego w oryginalnym pliku referencyjnym.


Menu