Ruby: Странности, которые не объясняют в туториалах

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.

🗓 Дата публикации: 14.07.2023, но это не точно...

Ruby подводные камни сравнение false и nil object_id замороженные объекты собеседования