Алиасинг метода приводит к разным объектам?

def foo
    "foo"
end

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

В приведенном выше примере я ожидал увидеть одинаковые выходные данные object_id для каждого вызова метода, поскольку они ссылаются на один и тот же метод. Почему я вижу разные object_id? Когда вы называете метод в Ruby, псевдоним не ссылается на исходный объект, а не на копию?

3 ответа

Решение

Начиная с нового ответа в ответ на ваши различные комментарии.

В примере кода вы вызываете метод, а не ссылаетесь на него. Вы хотите использовать

method(:foo)

на самом деле получить сам метод, а не результат его вызова.

Также, object_id это не правильный способ проверить, если два метода одинаковы, потому что method(:foo) каждый раз возвращает новый объект метода. Для аналогии, которая могла бы прояснить это, если вы открываете один и тот же файл дважды, у вас будет два разных дескриптора файла, даже если базовый файл был одинаковым. Вместо этого я думаю, что вы хотите:

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

который, как вы увидите, если вы попробуете это, возвращает true,

Ты звонишь object_id на объекте, возвращенном foo, которая является строкой, созданной в методе и, таким образом, будет отличаться каждый раз. Вы бы увидели те же результаты, если бы вы просто позвонили foo дважды. Он возвращает новую строку каждый раз. Если вы хотите постоянную строку, верните символ :foo вместо.

В прошлом, несмотря на то, что они используют одну и ту же реализацию прямо сейчас, это разные методы. Если вы переопределите foo вернуть строку "бар", foo2 по-прежнему будет возвращать "Фу".

Пытаться:

FOO = "foo"
def foo
    FOO
    end

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

Чтобы получить эффект, который вы хотите. "foo" является выражением, и оно вычисляется каждый раз, когда вызывается функция. Чтобы понять, почему это так, подумайте, что вы могли бы написать:

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
Другие вопросы по тегам