Ruby — это мощный и выразительный язык, но иногда его поведение может удивить даже опытных разработчиков. В этой статье разберём подводные камни Ruby: от особенностей сравнения false и nil до работы с object_id и замороженными объектами. Эти нюансы не только помогут глубже понять язык, но и пригодятся на собеседованиях.
❓ false == nil?
false == nil # => false
!nil # => true
!!nil # => false
- В Ruby только
falseиnil— ложь. - Но они не равны между собой.
🔍 object_id и литералы
:foo.object_id == :foo.object_id # => true
"foo".object_id == "foo".object_id # => false
42.object_id == 42.object_id # => true
- Символы и числа интернированы.
- Строки — новые объекты.
❄️ frozen по умолчанию?
42.frozen? # => true
:foo.frozen? # => true
nil.frozen? # => true
true.frozen? # => true
Да. В Ruby числа, символы, nil, true, false — всегда заморожены. Они неизменяемы.
🧠 eval, class_eval, instance_eval
eval("1 + 2") # => 3
User.class_eval { def x; 42; end }
obj.instance_eval { def y; 99; end }
Разные уровни контекста:
eval— глобальный, плох для безопасностиclass_eval— изменяет классinstance_eval— изменяет конкретный объект
🔚 Вывод:
Ruby странный, но предсказуемый — если знаешь подводные камни. Собеседующий тебя на сеньора скорее всего спросит про frozen?, object_id, eval.