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
Foi útil?

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

  1. O que classes / módulos são pesquisados ??para métodos resolver usados ??em doces objetos?

    p Candy.ancestors # => [Doce, objeto, Kernel]

  2. O doce tem método chamado Homer?

    p Candy.instance_methods (false) .grep ( "Homer") # => []

    p Candy.private_instance_methods (false) .grep ( "Homer") # => []

  3. OK Doce não tem qualquer método chamado 'Homer'.

  4. Qual é o próximo na cadeia de pesquisa (veja 1) => "objeto"

  5. 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

  1. O que é auto , pouco antes Homer é definido?

    p auto # => main def Homer puts "Olá" end

  2. 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.

misto no módulo 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.

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