#ruby
#ruby
Вопрос:
Всем привет! Мне было интересно, как работают методы в Ruby, которые не вызываются с использованием синтаксиса ClassName.method_name
. Некоторые с верхней части моей головы puts
, print
, gets
, chomp
. Эти методы могут быть вызваны без помощи оператора «точка». Почему это? Откуда они берутся? И как я могу увидеть полный список таких методов?
Ответ №1:
Все методы в Kernel
будут доступны для всех объектов класса Object
или любого класса, производного от Object
. Вы можете использовать Kernel.instance_methods
, чтобы перечислить их.
Комментарии:
1. Не совсем верно, поскольку они будут доступны объектам, класс которых относится к подклассам
Obejct
. Экземпляры классов, основанных наBasicObject
, не будут иметьKernel
методов.2. Прохладный. Я взял на себя смелость удалить
Kernel.methods
из вашего ответа, поскольку он также будет включатьKernel
одноэлементные методы, если таковые имеются, которые не включены вObject
(напримерdef Kernel.foo; end
)
Ответ №2:
Они поступают из Kernel
модуля, который автоматически включается для каждого класса. Эти
irb(main):001:0> class Foo
irb(main):002:1> end
=> nil
irb(main):003:0> Foo.included_modules
=> [Kernel]
Комментарии:
1. Еще короче:
Class.new.included_modules
. 🙂2. Извините, но «автоматически включается» может вводить в заблуждение и не совсем верно… Вводит в заблуждение, потому что это звучит так, как будто действие по включению
Kernel
выполняется Ruby, но это просто потому, что новые классы имеютObject
в качестве предка иObject
включаетKernel
. Включите любой другой модуль вObject
, и вы получите тот же эффект; в этом нет ничего особенногоKernel
. Это не совсем правильно, потому что классы, подклассированные из,BasicObject
не будутKernel
включены.