Pergunta

def foo
    "foo"
end

alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s

No exemplo acima, eu esperava ver a mesma saída object_id para cada chamada de método, uma vez que referenciar o mesmo método. Por que vejo diferente object_id de? Quando você não aliás um método em Ruby não o alias se referir ao objeto original, não uma cópia?

Foi útil?

Solução

Começar de novo com uma nova resposta em resposta a seus vários comentários.

No código de exemplo, você é chamando o método, não fazendo referência a ele. Você quer usar

method(:foo)

para começar realmente o método em si e não o resultado de chamá-lo.

Além disso, object_id não é o caminho certo para testar se dois métodos são os mesmos, porque method(:foo) retorna um novo método de objeto de cada vez. Para uma analogia que pode tornar isso mais claro, se você aberto o mesmo arquivo duas vezes, você teria dois identificadores de arquivo distintas mesmo que o arquivo subjacente era a mesma. Em vez disso, eu acho que você quer:

method(:foo) ==  method(:foo2)

que, como você vai ver se você tentar isso, os retornos true.

Outras dicas

Você está chamando object_id no objeto retornado por foo, que é uma string criada no método e, portanto, será diferente a cada vez. Você iria ver os mesmos resultados se você acabou de ligar foo duas vezes. Ele retorna uma nova seqüência de cada vez. Se você quer uma string constante, devolver o símbolo :foo vez.

Passado que, embora eles compartilham a mesma implementação agora, eles são diferentes métodos. Se você substituir foo para retornar a string "bar", foo2 ainda vai manter a voltar "foo".

Tente:

FOO = "foo"
def foo
    FOO
    end

alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s

Para obter o efeito que você está querendo. "Foo" é uma expressão e fica avaliada cada vez que a função é chamada. Para ver por que isso é, considerar que você poderia muito bem ter escrito:

def foo
    "It is now #{Time.now}"
    end

alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top