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

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

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

Обкладинка нотатки: Чому порожній рядок (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 в умовних виразах.

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

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

📝 Більше публікацій: