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

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

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

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

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

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

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

Приклад з програмування (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

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

📝 Більше публікацій:
Обкладинка нотатки: Чому Ruby код повертає nil після виконання puts?
Обкладинка нотатки: Яка різниця між nil і false в Ruby?
Обкладинка нотатки: Чому порожній рядок (string) у Ruby не є false?
Обкладинка нотатки: Область видимості локальної змінної в Ruby
Обкладинка нотатки: Чим відрізняється int та bigint в Ruby? Мінімальні та максимальні значення.
Обкладинка нотатки: Що означає помилка 'is out of range' в Ruby on Rails? Range Error - Integer with limit 4 bytes
Обкладинка нотатки: [Ruby] Що повернеться в результаті складання 10.5 та 10?
Обкладинка нотатки: [Ruby] Чим відрізняються змінні, що починаються з @, @@ та $?
Обкладинка нотатки: Що таке функція в програмуванні?
Обкладинка нотатки: [Фікс] extconf.rb failed під час встановлення Ruby-бібліотеки Gosu
Обкладинка нотатки: Як зробити пустий git commit?
Обкладинка нотатки: Ruby-бібліотека Gosu для створення 2D-ігор
Дисклеймер

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

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