Обкладинка нотатки: Чому порожній рядок (string) у Ruby не є false?

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

Зміст дописунатисність на посилання, щоб перейти до потрібного місця
Порожній рядок у Ruby не є false. Програмісти люблять порівнювати цей нюанс з Perl, бо в Perl порожній рядок є false.
Треба запам'ятати, що в Ruby false значення - це тільки nil та false.
У Ruby умовні вирази розраховуються на основі логічної істинності (truthiness) або хибності (falsiness) значень. Із всіх можливих значень у Ruby лише два є хибними: nil та false. Всі інші значення, включаючи порожній рядок (""), вважаються істинними (true).
Це означає, що при використанні порожнього рядка у умовному виразі він завжди буде трактуватися як true. Для перевірки, чи є рядок порожнім, можна використовувати кілька підходів:

Метод empty?

str = ""
puts "Порожній рядок" if str.empty?

Порожній рядок
=> nil
Ми бачимо, що str.empty? повернуло true і надрукувало відповідь. Далі ми бачимо nil, але чому - читайте більш детальніше в цьому дописі.
Ruby має вбудовані методи, які дозволяють показати чи рядок пустий. І саме ці методи треба використовувати в умовних виразах, щоб код був максисально зрозумілим.

Порівняння з пустим рядком

str = ""
puts "Порожній рядок" if str == ""
Порожній рядок
=> nil
Ruby прикольна мова і дозволяє робити одні й ті самі штуки різними шляхами. Тож при бажанні можна використовувати порівняння з пустим рядком в умовних виразах.
Перевіряємо довжину рядку (string)
str = ""
puts "Порожній рядок" if str.size == 0
# або 
puts "Порожній рядок" if str.length == 0
Як я й писав - ruby дозволяє робити одні й ті самі штуки різними шляхами (зверніть увагу на методи size та length).

Чому пустий рядок повертає true?

Можливо, це виглядає нелогічно, бо '' це щось, що більш схоже на ніщо / пустоту. Але давайте розберемось трохи в цьому.
У Ruby простіше розглядати всі об'єкти, окрім nil і false, як істинні. Це зменшує кількість специфічних випадків, які програмісту потрібно пам'ятати. Ruby побудована на принципі, що все є об'єктом. Це означає, що кожне значення, включаючи порожній рядок, має бути об'єктом і мати певну поведінку. Оскільки порожній рядок є об'єктом класу String, він розглядається як істинний. Вважаючи порожній рядок істинним, Ruby спрощує умовні вирази та робить код більш передбачуваним. Наприклад, в умовних виразах можна завжди покладатися на те, що лише nil та false будуть розглядатися як хибні.
str = ""
if str
  puts "Рядок не є nil або false"
else
  puts "Рядок є nil або false"
end
Доречі, давайте доведемо, що об'єкт класу String (а саме пустий рядок) не є immediate value. Порожній рядок (як і будь-який об'єкт класу String) не є immediate value, а представляється як об'єкт у пам'яті. У Ruby лише nil і false є false в умовних виразах. Всі інші значення, включаючи порожній рядок, вважаються істинними (truthy).
str1 = ""
str2 = ""
puts str1.object_id == str2.object_id

=> false # Тобто кожен рядок має свій object_id 

str1.object_id
=> 46820

str2.object_id
=> 46800
Тобто ми маємо два різних об'єкти String з пустим змістом. І Об'єкт повертає true в умовних виразах.

🔗 Цитувати допис: "Чому порожній рядок (string) у Ruby не є false?"

Якщо ви хочете процитувати цей допис у своїй роботі, статті, блозі, використовуйте наведену нижче інформацію.

Розгорнути деталі


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

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

📝 Більше публікацій:
Обкладинка нотатки: Для чого потрібна база даних CVE (Common Vulnerabilities and Exposures)?
Обкладинка нотатки: Чи створює Ruby нову копію об’єкта при присвоєнні змінної змінній?
Обкладинка нотатки: В чому різниця між immediate value та reference у Ruby?
Обкладинка нотатки: Чому Ruby код повертає nil після виконання puts?
Обкладинка нотатки: Яка різниця між nil і false в Ruby?
Обкладинка нотатки: Область видимості локальної змінної в Ruby
Обкладинка нотатки: Чим відрізняється int та bigint в Ruby? Мінімальні та максимальні значення.
Обкладинка нотатки: Що означає помилка 'is out of range' в Ruby on Rails? Range Error - Integer with limit 4 bytes
Обкладинка нотатки: Що таке імутабільність та мутабільність?
Обкладинка нотатки: [Ruby] Що повернеться в результаті складання 10.5 та 10?
Обкладинка нотатки: [Ruby] Чим відрізняються змінні, що починаються з @, @@ та $?
Дисклеймер

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

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