ГоловнаВсі публікаціїКатегоріїПро проєкт

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

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

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

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

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

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

Приклад з програмування (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 чи щось подібне, щоб уникнути помилок після оновлення. Подивимось.
Імутабельність та мутабільність – це фундаментальні концепції у програмуванні, які допомагають програмістам керувати станом об'єктів та їх змінами. Використання імутабельних об'єктів може зробити код більш передбачуваним та простішим для тестування, тоді як мутабільні об'єкти можуть бути зручнішими для моделювання динамічних систем.
Чому Ruby код повертає nil після виконання puts?
29.05.2024 20:30

Чому Ruby код повертає nil після виконання puts?

meme code
meme code@memecode
Яка різниця між nil і false в Ruby?
29.05.2024 20:59

Яка різниця між nil і false в Ruby?

meme code
meme code@memecode
Чому порожній рядок (string) у Ruby не є false?
31.05.2024 14:39

Чому порожній рядок (string) у Ruby не є false?

meme code
meme code@memecode
Область видимості локальної змінної в Ruby
03.06.2024 16:46

Область видимості локальної змінної в Ruby

meme code
meme code@memecode
Чим відрізняється int та bigint в Ruby? Мінімальні та максимальні значення.
13.06.2024 06:37

Чим відрізняється int та bigint в Ruby? Мінімальні та максимальні значення.

meme code
meme code@memecode
Що означає помилка 'is out of range' в Ruby on Rails? Range Error - Integer with limit 4 bytes
13.06.2024 07:18

Що означає помилка 'is out of range' в Ruby on Rails? Range Error - Integer with limit 4 bytes

meme code
meme code@memecode
[Ruby] Що повернеться в результаті складання 10.5 та 10?
23.06.2024 13:23

[Ruby] Що повернеться в результаті складання 10.5 та 10?

meme code
meme code@memecode
[Ruby] Чим відрізняються змінні, що починаються з @, @@ та $?
23.06.2024 14:00

[Ruby] Чим відрізняються змінні, що починаються з @, @@ та $?

meme code
meme code@memecode
Що таке функція в програмуванні?
24.06.2024 18:15

Що таке функція в програмуванні?

meme code
meme code@memecode
[Фікс] extconf.rb failed під час встановлення Ruby-бібліотеки Gosu
27.06.2024 16:38

[Фікс] extconf.rb failed під час встановлення Ruby-бібліотеки Gosu

meme code
meme code@memecode
Як зробити пустий git commit?
28.06.2024 08:33

Як зробити пустий git commit?

meme code
meme code@memecode
Ruby-бібліотека Gosu для створення 2D-ігор
29.06.2024 08:48

Ruby-бібліотека Gosu для створення 2D-ігор

meme code
meme code@memecode