Не ключевое слово, не в Ruby-Doc Какая языковая конструкция включает и расширяет?

#ruby #keyword

#ruby #ключевое слово

Вопрос:

Если я не пропустил записи, я не могу найти include или extend в Ruby-Doc.org документация или в списке ключевых слов Ruby. Я могу найти obj.extend, но не оператор extend, используемый в определении класса, например

 # add module Foo's methods as class methods of TestClass
class TestClass
  extend Foo
end
  

или

 # add module Foo's methods as instance methods of TestClass
class TestClass
  include Foo
end
  

Что касается языковой конструкции, если это правильный термин, что такое include и extend и где они определены?

Было бы неплохо понять, как именно эти два оператора реализованы в языке Ruby. Спасибо.

Ответ №1:

extend это Object метод, удобный метод для extend_object (более или менее).

include находится в Module оболочке вокруг append_features .

Комментарии:

1. Мне не удалось связать self.extend с obj.extend в моем сообщении :).

2. @Dennis Поверьте мне — синтаксис, иерархия классов и часто тонкая магия делают отслеживание реализации поведения … временами проблематичным. Это похоже на приключение без дополнительных затрат на то, чтобы быть веселым.

3. @Dennis Хотя это и забавно, в каком-то больном, вызывающем смысле.

4. Дэйв, еще один вопрос, если ты не возражаешь: Klass.private_methods показывает include как один из private_method для Klass — не могли бы вы или кто-нибудь другой, пожалуйста, объяснить, почему класс объектов имеет доступ к закрытому методу класса Module? Имеет ли это какое-то отношение к модулю < Подклассу объекта?

5. @Dennis В Ruby подклассы могут вызывать частные методы. Некоторые ссылки: ссылка 1 , ссылка 2 , ссылка 3 .

Ответ №2:

include — это частный метод класса Module, а extend — это метод в классе Object