Що таке імутабільність та мутабільність?
Дисклеймер

Інформація на сайті tseivo.com є суб'єктивною та відображає особисті погляди та досвід авторів та авторок блогів.

Використовуйте цей ресурс як одне з декількох джерел інформації під час своїх досліджень та прийняття рішень. Завжди застосовуйте критичне мислення. Людина сама несе відповідальність за свої рішення та дії.

Обкладинка нотатки: Що таке імутабільність та мутабільність?

Що таке імутабільність та мутабільність?

Імутабільність (незмінність) та мутабільність (змінність) – це властивості об'єктів (у програмуванні та інших сферах), які визначають, чи можуть об'єкти змінюватися після їх створення. Подивився як правильно - мутабЕльність чи мутабІльніть і здається, що обидва варіанта правильні (але це не точно ^_^). 

Приклад імутабельності

Уявіть собі фотографію, яку ви зробили та надрукували. Після того як фотографія надрукована, ви не можете змінити її вміст. Якщо вам не подобається, що на фотографії хтось зображений із заплющеними очима, ви не можете змінити цю фотографію – замість цього вам доведеться зробити нову фотографію. В цьому прикладі фотографія є імутабельною.

Приклад мутабельності

Тепер уявіть собі глиняну фігуру, яку ви ліпите. Якщо ви вирішите, що хочете змінити форму носа на фігурі, ви можете легко зробити це, змінюючи форму глини. В цьому прикладі глиняна фігура є мутабільною.

Приклад з програмування (Ruby)

Строки (Strings) у багатьох мовах програмування є імутабельними. Це означає, що після створення рядка його значення не можна змінити. Але кожна мова має свої нюанси і в залежності від версії мови - концепція імутабельності/мутабельності може змінюватись.
Наприклад в Ruby - String може мутувати (змінюватись). Перевіремо (ruby 3.2.1):
str = "Hello"

puts str.object_id
=> 1960

str.upcase!
=> "HELLO"

puts str
=> HELLO

puts str.object_id
=> 1960
Тобто за допомогою методу upcase! ми змінили текст змінної.
Якщо ми хочемо щоб строки не змінювались - треба додати магічний коментар (magic comment) на початку рубі-скріпта:
# frozen_string_literal: true
Тобто, наш файл (example.rb) буде виглядати ось так:
# frozen_string_literal: true

str = "Hello"
puts str.object_id

str.upcase!
puts str
puts str.object_id
А результат його запуска буде наступним:
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>'
Ми бачимо що скріпт надрукував - 60. Це результат коду puts str.object_id. А далі ми отримуємо помилку виконання модифікації String - can't modify frozen String: "Hello" (FrozenError). Тобто ми ввімкнули заморозку значень (string literal) і тепер отримуємо помилку при спробі модифікації. Пишуть, що ruby 3.4 буде мати заморожені літерали за замовчуванням. Тож треба буде додавати опцію --disable-frozen-string-literal чи щось подібне, щоб уникнути помилок після оновлення. Подивимось.
Імутабельність та мутабільність – це фундаментальні концепції у програмуванні, які допомагають програмістам керувати станом об'єктів та їх змінами. Використання імутабельних об'єктів може зробити код більш передбачуваним та простішим для тестування, тоді як мутабільні об'єкти можуть бути зручнішими для моделювання динамічних систем.

🙌 Підтримати блог @memecode

Ви можете поширити цей допис у соцмережах, чим допоможете платформі цейво розвиватись (* ^ ω ^)

📝 Більше публікацій: