All original content is created in Ukrainian. Not all content has been translated yet. Some posts may only be available in Ukrainian.Learn more

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

Post cover: Що таке імутабільність та мутабільність?
This content has not been translated yet.We're showing the original Ukrainian content below.
Імутабільність (незмінність) та мутабільність (змінність) – це властивості об'єктів (у програмуванні та інших сферах), які визначають, чи можуть об'єкти змінюватися після їх створення. Подивився як правильно - мутабЕльність чи мутабІльніть і здається, що обидва варіанта правильні (але це не точно ^_^). 

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

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

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

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

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

This post doesn't have any additions from the author yet.

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

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

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

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

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

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

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

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

meme code
meme code@memecode
Чим відрізняється int та bigint в Ruby? Мінімальні та максимальні значення.
13 Jun 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 Jun 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 Jun 13:23

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

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

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

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

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

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

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

meme code
meme code@memecode
How to make an empty git commit?
28 Jun 08:33

How to make an empty git commit?

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

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

meme code
meme code@memecode