Есть ли в Ruby протокол Metaobject и, если нет, можно ли его реализовать? - PullRequest
5 голосов
/ 31 октября 2010

Прошу прощения за мое невежество, но что такое протокол Метаобъекта, и есть ли у Руби?Если нет, то возможно ли реализовать один для Ruby?Какими функциями мог бы обладать протокол Metaobject, если бы он был у Ruby?

Ответы [ 2 ]

2 голосов
/ 01 ноября 2010

Что такое протокол Metaobject?

Лучшее описание, с которым я столкнулся, это документация Class::MOP:

Протокол мета-объекта - это API для объектной системы.

Точнее говоря, он абстрагирует компоненты объектной системы (классы, объект, методы, атрибуты объекта и т. Д.).Затем эти абстракции можно использовать для проверки и управления объектной системой, которую они описывают.

Можно сказать, что для любой объектной системы существует два MOP;неявное MOP и явное MOP.Неявный MOP обрабатывает такие вещи, как диспетчеризация или наследование методов, которые происходят автоматически как часть работы объектной системы.Явный MOP обычно обрабатывает функции самоанализа / отражения объектной системы.

Все объектные системы имеют неявные MOP.Без них они бы не работали.Явные MOP встречаются гораздо реже и в зависимости от языка могут варьироваться от ограничительного (Reflection в Java или C #) до широко открытого (CLOS - прекрасный пример).


У Ruby есть один?

В соответствии с этой веткой о Повторное открытие встроенных классов, переопределение встроенных функций? Perlmonks статья Я думаю, что ответ нет (по крайней мере, в самом строгом смысле того, что такое MOP).

Очевидно, что здесь есть некоторая комната для маневра, так что, возможно, стоит написать вопрос на стороне Perl SO, потому что Class::MOP / Лось Автор отвечает вопросов там .

0 голосов
/ 11 июля 2017

Если вы посмотрите ближе к определению, вы увидите, что Ruby имеет MOP. Это как в CLOS? Нет, CLOS - это метакруглая MOP , которая великолепна (я бы даже сказал, гениально), но это не единственный верный способ, взгляните на Smalltalk . Для реализации (скажем, базового) MOP все, что вам нужно, это предоставить функции, которые позволяют вашей среде выполнения:

  1. Создать или удалить новый класс
  2. Создать новое свойство или метод
  3. Заставить класс наследоваться от другого класса («изменить структуру класса»)
  4. Создание или изменение кода, определяющего методы класса.

И Руби предоставляет способ сделать все это.

С другой стороны: автор Class :: MOP прав (ИМХО), когда утверждает, что некоторые вещи, которые вы можете сделать с мета-циклическим MOP, может быть трудно сделать в Ruby (ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: У меня есть ноль, zilch, nada знание Perl, так что я думаю о Smalltalk как MOP против CLOS как MOP здесь), но большинство из них очень специфичны (я имею в виду инстанцирование метакласса здесь) и есть способы сделать вещи работать без них. Я думаю, что все зависит от вашей точки зрения, мета-циклические СС более круче, но больше с академической стороны, а не-мета-циклические СС более практичны и проще в реализации.

...