Імутабільність (незмінність) та
мутабільність (змінність) – це властивості об'єктів (у програмуванні та інших сферах), які визначають, чи можуть об'єкти змінюватися після їх створення. Подивився як правильно - мутаб
Ельність чи мутаб
Ільніть і здається, що обидва варіанта правильні (але це не точно ^_^).
Приклад імутабельності
Уявіть собі фотографію, яку ви зробили та надрукували. Після того як фотографія надрукована, ви не можете змінити її вміст. Якщо вам не подобається, що на фотографії хтось зображений із заплющеними очима, ви не можете змінити цю фотографію – замість цього вам доведеться зробити нову фотографію. В цьому прикладі фотографія є імутабельною.
Приклад мутабельності
Тепер уявіть собі глиняну фігуру, яку ви ліпите. Якщо ви вирішите, що хочете змінити форму носа на фігурі, ви можете легко зробити це, змінюючи форму глини. В цьому прикладі глиняна фігура є мутабільною.
Приклад з програмування (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 чи щось подібне, щоб уникнути помилок після оновлення. Подивимось.
Імутабельність та мутабільність – це фундаментальні концепції у програмуванні, які допомагають програмістам керувати станом об'єктів та їх змінами. Використання імутабельних об'єктів може зробити код більш передбачуваним та простішим для тестування, тоді як мутабільні об'єкти можуть бути зручнішими для моделювання динамічних систем.