Как вы уже обнаружили, self
относится не к объекту, с которого был запущен IRB, а к TOPLEVEL_BINDING
, который, по-видимому, является экземпляром самого класса Object
.
Вы все еще можете запустить сеанс IRB с определенным классом или объектом в качестве контекста, но это не так просто, как просто запустить IRB.
Если вам важно запустить IRB с определенным контекстом, тогда это действительно легкоделать, когда вы запускаете IRB вручную.Просто запустите IRB как обычно, а затем вызовите метод irb
, передав ему объект / класс, который вы хотите использовать в качестве контекста.
$ irb
irb(main):002:0> require 'myclass'
=> true
irb(main):003:0> irb MyClass
irb#1(MyClass):001:0> self
=> MyClass
Вы также можете запустить сеанс IRB программно и указать контекст, но это не так.почти так же легко, как и должно быть, потому что вам нужно воспроизвести часть кода запуска IRB.После долгих экспериментов и копаний в исходном коде IRB я смог придумать что-то, что работает:
require 'irb'
IRB.setup nil
IRB.conf[:MAIN_CONTEXT] = IRB::Irb.new.context
require 'irb/ext/multi-irb'
IRB.irb nil, self