Методы Ruby без класса?

#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 включены.