Pergunta
Como é que Ruby permite que um métodos de acesso de classe fora da classe implicitamente?
Exemplo:
class Candy
def land
homer
end
end
def homer
puts "Hello"
end
Candy.new.land #Outputs Hello
Solução
A definição do método de "Homer" está adicionando o método à classe de objeto. Não é a definição de uma função livre.
Candy Classe herda implicitamente do objeto, e por isso tem acesso aos métodos no objeto. Quando você chama de "Homer" no método "terra", a resolução método não pode encontrar uma definição na classe atual, vai para a classe super, encontrar o método que você adicionou ao objeto, e chama-o.
Outras dicas
Uma maneira simples de descobrir o que acontece
-
O que classes / módulos são pesquisados ??para métodos resolver usados ??em doces objetos?
p Candy.ancestors # => [Doce, objeto, Kernel]
-
O doce tem método chamado Homer?
p Candy.instance_methods (false) .grep ( "Homer") # => []
p Candy.private_instance_methods (false) .grep ( "Homer") # => []
-
OK Doce não tem qualquer método chamado 'Homer'.
-
Qual é o próximo na cadeia de pesquisa (veja 1) => "objeto"
-
O objeto tem um método chamado "local"? p Object.instance_methods (false) .grep ( "Homer") # => []
p Object.private_instance_methods (false) .grep ( "Homer") # => [ "Homer"]
Candy tem objeto em sua cadeia de pesquisa que por sua vez tem um método de instância "Homer" privado para resolução método tiver êxito
O def declaração sempre define o método na classe de qualquer auto é no ponto de definição
-
O que é auto , pouco antes Homer é definido?
p auto # => main def Homer puts "Olá" end
-
Então, qual é o seu tipo?
p self.class # => objeto
Qual é porque Homer acaba no objeto
Tecnicamente, a definição do método homer
é realmente no módulo Kernel
que é misturado em Object
, e não sobre Object
diretamente. Assim, quando homer
não é uma variável local ou um método de instância definido em Candy
, a cadeia método herança rubi é seguido através Object
e, em seguida, para o.
Kernel
e, em seguida, este código é executado
Editar: Desculpe, eu não sei porque eu pensei que isso. Parece que o método realmente vive em Object
. Não tenho certeza ele faz muita diferença na prática, mas eu deveria ter confirmado as coisas antes de postar.
Rubi não tem funções de livre flutuação. Cada método pertence a algum objeto. Métodos que você def
no nível superior estão realmente se tornando métodos de instância de Object
classe. Porque tudo é uma Object
em algum nível, todos os objetos têm acesso a métodos de instância de Object
.