Definições dos termos e frases usadas na linguagem de programação Ruby e nessa implementação. Veja também “The Ruby Programming Language” by Flanagan and Matsumoto [O’Reilly 2008] and “Programming Ruby: The Pragmatic Programmer’s Guide” 2nd or 3rd Edition by Thomas et al [The Pragmatic Programmers 2005-2008]
método de pesquisa ou resolução de método
A regra é simples: Pegue o objeto localizado na classe de onde o objeto veio (que nem sempre retorna um valor de Objetct#class; se o objeto tiver um. Ele será uma classe singleton) e começa a procurar.
A busca sobe até a cadeia de superclasses enquanto a superclasse for nil.
Nesse caso, procura pelo method missing. Se ele falhar na busca o method missing falha tragicamente
+----------------+
| 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
Resolvendo método ‘wanker’ – procura método nas tabelas:
Encontrado
method_table
A estrutura de dados em cada classe (e módulo) que contem os métodos definidos para cada classe.
No Rubinius um método de classe é uma instância de LookupTable.
MatzRuby
Veja MRI
MRI
Matz’s Ruby Interpreter ou implementação do interpretador ruby. O nome da implementação oficial do Ruby. Veja http://ruby-lang.org.
private send
Uma chamada de método que não tem um receptor léxico explícito. O receptor de uma chamada é o +self+. Por exemplo:
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
A chamada para +you_are_mine+ no método +sunshine+ é uma chamada privada. A chamada para +today.you_are_mine+ não terá sucesso porque métodos privados não tem receptor explicito. Nesse caso, o objeto +today+ é um receptor explicito
singleton class
Todo objeto no Ruby pode ter uma, apesar de elas só serem criadas quando necessário. A classe singleton detém o método e a tabela constanteis que pertence somente a uma instancia de objeto particular. Por exemplo, o método +hello+ definido abaixo existe somente na classe singleton de +obj+.
obj = Object.new
def obj.hello
puts 'hi'
end
Todas as classes em Ruby são também objetos, elas podem ter também sua classe singleton. Os métodos chamados ‘métodos de classe’ são somente métodos na tabela de métodos da classe singleton. O método +honk+ existe na classe singleton para a classe +Car+.
class Car
def self.honk
end
end
No Rubiniys, classes singleton são instancias da classe SingletonClass. A classe singleton para um objeto pode ser obtida pela chamada para método +singleton_class+. O arranjo global dos conceitos envolvidos aqui é as vezes referenciados como o ‘Protocolo Meta-Objeto’ ou +MOP+.
superclass
É uma classe que uma determinada classe herda imediatament. A classe Objetct é a superclasse de todas as classes que não herda explicitamente de outra classe.
class A
end
class B < A
end
A classe A herda de Object. Em outras palavras, A.superclass == Objetc. A classe B herda explicitamente da classe A. Então, B.superclass == A.