#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