Порожній рядок у 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 в умовних виразах.