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ść?
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.
Podoba ci się?Zareaguj
🧵

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

Jaka jest różnica między wartością bezpośrednią a referencją w Ruby?
29 maj '24 12:00

Jaka jest różnica między wartością bezpośrednią a referencją w Ruby?

7 gru '23 08:25

Czym jest OOP (programowanie obiektowe)?

Co to jest XOR i jak to działa?
21 mar '25 17:05

Co to jest XOR i jak to działa?

9 gru '23 12:21

Czym jest polimorfizm? Przykład użycia polimorfizmu w Ruby.

Czym jest Konwencja nad Konfiguracją (w kontekście RoR i nie tylko)?
26 wrz '24 07:47

Czym jest Konwencja nad Konfiguracją (w kontekście RoR i nie tylko)?

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 '24 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

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

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

Zakres widoczności zmiennej lokalnej w Ruby
3 cze '24 16:46

Zakres widoczności zmiennej lokalnej w Ruby

Dlaczego pusty ciąg (string) w Ruby nie jest fałszem?
31 maj '24 14:39

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

Jaka jest różnica między nil a false w Ruby?
29 maj '24 20:59

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

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

Dlaczego kod Ruby zwraca nil po wykonaniu puts?

[Ruby] Co zwróci wynik dodawania 10.5 i 10?
23 cze '24 13:23

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

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

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

Co to jest funkcja w programowaniu?
24 cze '24 18:15

Co to jest funkcja w programowaniu?

[Fix] extconf.rb nie powiódł się podczas instalacji biblioteki Ruby Gosu
27 cze '24 16:38

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

Jak zrobić pusty commit w gicie?
28 cze '24 08:33

Jak zrobić pusty commit w gicie?

Biblioteka Ruby Gosu do tworzenia gier 2D
29 cze '24 08:48

Biblioteka Ruby Gosu do tworzenia gier 2D