Pergunta

Perdoe minha ignorância, mas o que é um protocolo de metaobjetas, e Ruby tem um? Caso contrário, é possível implementar um para Ruby? Quais recursos um protocolo metaobject possui se Ruby deveria ter um?

Foi útil?

Solução

O que é um protocolo MetaObject?

A melhor descrição que encontrei é do Class::MOP documentação:

Um protocolo de meta objeto é uma API para um sistema de objetos.

Para ser mais específico, abstraia os componentes de um sistema de objetos (classes, objeto, métodos, atributos de objeto etc.). Essas abstrações podem ser usadas para inspecionar e manipular o sistema de objetos que eles descrevem.

Pode -se dizer que existem dois MOPs para qualquer sistema de objetos; O MOP implícito e o MOP explícito. O MOP implícito lida com coisas como o envio ou herança de método, que acontecem automaticamente como parte de como o sistema de objetos funciona. O MOP explícito normalmente lida com os recursos de introspecção/reflexão do sistema de objetos.

Todos os sistemas de objetos têm MOPs implícitos. Sem um, eles não funcionariam. Os MOPs explícitos são muito menos comuns e, dependendo do idioma, podem variar de restritivo (reflexão em Java ou C#) a amplo (Clos é um exemplo perfeito).


Ruby tem um?

De acordo com este tópico em Reabrir aulas de incorporação, redefinindo funções construídas? Perlmonks Artigo eu acho que a resposta é não (Pelo menos no sentido mais estrito do que é um esfregão).

Claramente, há algum espaço de contorção aqui, então pode valer a pena postar uma pergunta no lado perl de Class::MOP / alce o autor responde perguntas lá.

Outras dicas

Se você olhar mais de perto da definição, você verá que Ruby tem um esfregão. É como aquele em clos? Não, Clos é um MOP meta-circular o que é ótimo (eu diria gênio), mas não é o único caminho verdadeiro, dê uma olhada em Conversa fiada. Para implementar um (digamos básico), tudo o que você precisa é fornecer funções que permitam que seu tempo de execução seja:

  1. Criar ou excluir uma nova classe
  2. Criar uma nova propriedade ou método
  3. Fazer com que uma classe herde de uma classe diferente ("Altere a estrutura da classe")
  4. Gere ou altere o código que define os métodos de uma classe.

E Ruby fornece uma maneira de fazer tudo isso.

Em uma nota lateral: o autor de Class :: MOP está certo (IMHO) quando afirma que algumas das coisas que você pode fazer com uma meta circular pode ser difícil de fazer em Ruby (isenção de responsabilidade: eu tenho Zero, Zilch, Nada Conhecimento Perl, então estou pensando em Smalltalk como o MOP vs Clos como o MOP aqui), mas a maioria deles é muito específica (estou pensando em instantamento de metaclasse aqui) e há maneiras de fazer as coisas funcionarem sem elas. Eu acho que tudo depende da sua visão pontual, os esfregões meta -circulares são mais frios, mas mais no lado acadêmico e os esfregáticos não -circulares são mais práticos e mais fáceis de implementar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top