Алиасинг метода приводит к разным объектам?
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