This topic has missing or partial documentation. Please help us improve it.
Здесь даны определения терминов и фраз используемых в языке программирования Ruby и конкретно в этой реализации. Смотри также книгу “Язык программирования Ruby” авторов Флэнегана и Мацумото [O’Reilly 2008] и “Programming Ruby: The Pragmatic Programmer’s Guide” второе или третье издание автора Томаса и др. [The Pragmatic Programmers 2005-2008]
метакласс
Также известен как +синглетон+ и +eigenclass+. Каждый объект в Ruby может иметь один метакласс, который создается только при необходимости. Метакласс содержит таблицу методов и констант, которая принадлежит только определенному объекту. Например, описанный ниже метод +hello+ существует только в метаклассе объекта +obj+.
obj = Object.new
def obj.hello
puts 'hi'
end
Так как все классы в Ruby также являются объектами, они тоже могут иметь метаклассы. Методы, которые называют “методами класса”, являются просто методами в таблице методов, принадлежащей метаклассу класса. Метод +honk+ существует в метаклассе класса +Car+.
class Car
def self.honk
end
end
В Rubinius, метаклассы являются объектами класса MetaClass. Доступ к метаклассу объекта можно получить вызовом метода +metaclass+. Схему, описанную здесь, в целом иногда называют “Метаобъектный протокол” или +MOP+.
поиск методов или разрешение методов
Простое правило: взять объект, который находится в слоте класса этого объекта (это значение невсегда равнозначно результату вызова Object#class) и начать искать.
Поиск идет по цепочке родительских классов, пока родитель не будет равен nil.
В этом случае повторяется поиск для метода method_missing. Если и этот метод не будет найден – трагедия.
+----------------+
| nil |
+----------------+
^
| superclass
|
+----------------+
| Object |
+----------------+
^
| superclass
|
+----------------+
| Module |
+----------------+
^
| superclass
|
+----------------+
| Class |
+----------------+
^
| superclass
|
+----------------+
| SingletonClass |
| (Object) |
+----------------+
^
| superclass
|
+-------------+ +----------------+
| F | -----------------> | SingletonClass |
+-------------+ singleton class | (F) |
+----------------+
class Class
def wanker
puts 'you are'
end
end
class F
def self.bloke
wanker
end
end
Поиск метода ‘wanker’ будет произведен в таблицах методов:
Найден
таблица методов
Структура данных, присутствующая в каждом классе (и модуле), которая содержит список методов, определенных в этом классе.
В Rubinius таблица методов класса – это объект класса LookupTable.
MatzRuby
Смотри MRI
MRI
Matz’s Ruby Interpreter или Matz’s Ruby Implementation. Аббревиатура для обозначения официальной реализации Ruby. Смотри http://ruby-lang.org.
приватный вызов
Вызов метода, у которого явно не указан получатель. Получатетелем является +self+. Например:
class A
private
def you_are_mine
end
end
class B < A
def sunshine
you_are_mine
end
end
class C
def dear
today = B.new
today.you_are_mine
end
end
Вызов метода +you_are_mine+ в методе +sunshine+ назвается приватным вызовом. Вызвать +today.you_are_mine+ не удасться, потому что приватные методы не могут иметь явного получателя. В данном случае объект +today+ является явным получателем.
родительский класс
Это класс, от которого наследуется другой класс. Класс Object является родительским классом всех объектов, которые явно не наследуются от других классов.
class A
end
class B < A
end
Класс A наследуется от класса Object. Иными словами A.superclass == Object. Класс B явно наследуется от класса A, таким образом B.superclass == A.