Различное поведение при запуске script против консоли IRB?

У меня есть простой фрагмент кода, который определяет метод (на Ruby Main Object), а затем проверяет, не определено ли оно.

puts "#{self} #{self.class}"
def foo;end
puts self.methods.include?(:foo)

Когда я запускаю это в консоли Ruby. Я получаю:

main Object
true

Если я вставляю этот код в файл .rb и запускаю такой файл ruby test_script.rb, я получаю следующий вывод

main Object
false

Я не могу понять, почему я вижу это поведение. Метод определяется в script, так как я могу вызвать метод.

Я запускаю оба на Ruby 2.3.4

Ответ 1

IRB привязывает методы в области верхнего уровня к main как общедоступные методы для удобства, но обычные программы Ruby привязывают методы, определенные в области верхнего уровня, к main как частные методы.

Вы можете найти здесь ссылку на основной контекст верхнего уровня Ruby.