Cała oryginalna treść jest tworzona po ukraińsku. Nie wszystkie treści zostały jeszcze przetłumaczone. Niektóre posty mogą być dostępne tylko po ukraińsku.Dowiedz się więcej

Czym jest niemutowalność i mutowalność?

Okładka posta: Czym jest niemutowalność i mutowalność?
Spis treściKliknij link, aby przejść do wybranego miejsca
Ta treść została automatycznie przetłumaczona z ukraińskiego.
Immutability (niezmienność) oraz mutability (zmienność) – to właściwości obiektów (w programowaniu i innych dziedzinach), które określają, czy obiekty mogą się zmieniać po ich utworzeniu. Sprawdziłem, jak to poprawnie - mutabElność czy mutabIlność i wydaje się, że oba warianty są poprawne (ale to nie jest pewne ^_^). 

Przykład niezmienności

Wyobraź sobie zdjęcie, które zrobiłeś i wydrukowałeś. Po tym, jak zdjęcie zostało wydrukowane, nie możesz zmienić jego zawartości. Jeśli nie podoba ci się, że na zdjęciu ktoś jest z zamkniętymi oczami, nie możesz zmienić tego zdjęcia – zamiast tego musisz zrobić nowe zdjęcie. W tym przykładzie zdjęcie jest niezmienne.

Przykład zmienności

Teraz wyobraź sobie glinianą figurkę, którą lepiasz. Jeśli zdecydujesz, że chcesz zmienić kształt nosa na figurce, możesz to łatwo zrobić, zmieniając kształt gliny. W tym przykładzie gliniana figurka jest zmienna.

Przykład z programowania (Ruby)

Łańcuchy (Strings) w wielu językach programowania są niezmienne. Oznacza to, że po utworzeniu łańcucha jego wartość nie może być zmieniona. Ale każdy język ma swoje niuanse i w zależności od wersji języka - koncepcja niezmienności/zmienności może się różnić.
Na przykład w Ruby - String może mutować (zmieniać się). Sprawdźmy (ruby 3.2.1):
str = "Hello"

puts str.object_id
=> 1960

str.upcase!
=> "HELLO"

puts str
=> HELLO

puts str.object_id
=> 1960
To znaczy, za pomocą metody upcase! zmieniliśmy tekst zmiennej.
Jeśli chcemy, aby łańcuchy się nie zmieniały - musimy dodać magiczny komentarz (magic comment) na początku skryptu Ruby:
# frozen_string_literal: true
To znaczy, nasz plik (example.rb) będzie wyglądał tak:
# frozen_string_literal: true

str = "Hello"
puts str.object_id

str.upcase!
puts str
puts str.object_id
A wynik jego uruchomienia będzie następujący:
ruby ~/Desktop/example.rb 
60
/Users/user/Desktop/example.rb:5:in `upcase!': can't modify frozen String: "Hello" (FrozenError)
	from /Users/user/Desktop/example.rb:5:in `<main>'
Widzimy, że skrypt wydrukował - 60. To wynik kodu puts str.object_id. A następnie otrzymujemy błąd wykonania modyfikacji String - can't modify frozen String: "Hello" (FrozenError). To znaczy, że włączyliśmy zamrożenie wartości (string literal) i teraz otrzymujemy błąd przy próbie modyfikacji. Mówią, że Ruby 3.4 będzie miał zamrożone literały domyślnie. Więc trzeba będzie dodać opcję --disable-frozen-string-literal lub coś podobnego, aby uniknąć błędów po aktualizacji. Zobaczmy.
Niezmienność i zmienność – to fundamentalne koncepcje w programowaniu, które pomagają programistom zarządzać stanem obiektów i ich zmianami. Użycie obiektów niezmiennych może sprawić, że kod będzie bardziej przewidywalny i łatwiejszy do testowania, podczas gdy obiekty zmienne mogą być bardziej wygodne do modelowania dynamicznych systemów.

Ten post nie ma jeszcze żadnych dodatków od autora.

Dlaczego kod Ruby zwraca nil po wykonaniu puts?
29 maj 20:30

Dlaczego kod Ruby zwraca nil po wykonaniu puts?

meme code
meme code@memecode
Jaka jest różnica między nil a false w Ruby?
29 maj 20:59

Jaka jest różnica między nil a false w Ruby?

meme code
meme code@memecode
Dlaczego pusty ciąg (string) w Ruby nie jest fałszem?
31 maj 14:39

Dlaczego pusty ciąg (string) w Ruby nie jest fałszem?

meme code
meme code@memecode
Zakres widoczności zmiennej lokalnej w Ruby
3 cze 16:46

Zakres widoczności zmiennej lokalnej w Ruby

meme code
meme code@memecode
Czym różni się int od bigint w Ruby? Minimalne i maksymalne wartości.
13 cze 06:37

Czym różni się int od bigint w Ruby? Minimalne i maksymalne wartości.

meme code
meme code@memecode
Co oznacza błąd 'is out of range' w Ruby on Rails? Błąd zakresu - Liczba całkowita z limitem 4 bajtów
13 cze 07:18

Co oznacza błąd 'is out of range' w Ruby on Rails? Błąd zakresu - Liczba całkowita z limitem 4 bajtów

meme code
meme code@memecode
[Ruby] Co zwróci wynik dodawania 10.5 i 10?
23 cze 13:23

[Ruby] Co zwróci wynik dodawania 10.5 i 10?

meme code
meme code@memecode
[Ruby] Czym różnią się zmienne zaczynające się od @, @@ i $?
23 cze 14:00

[Ruby] Czym różnią się zmienne zaczynające się od @, @@ i $?

meme code
meme code@memecode
Co to jest funkcja w programowaniu?
24 cze 18:15

Co to jest funkcja w programowaniu?

meme code
meme code@memecode
[Fix] extconf.rb nie powiódł się podczas instalacji biblioteki Ruby Gosu
27 cze 16:38

[Fix] extconf.rb nie powiódł się podczas instalacji biblioteki Ruby Gosu

meme code
meme code@memecode
Jak zrobić pusty commit w gicie?
28 cze 08:33

Jak zrobić pusty commit w gicie?

meme code
meme code@memecode
Biblioteka Ruby Gosu do tworzenia gier 2D
29 cze 08:48

Biblioteka Ruby Gosu do tworzenia gier 2D

meme code
meme code@memecode