Методы алиасинга в Ruby - PullRequest
       7

Методы алиасинга в Ruby

1 голос
/ 26 февраля 2011

Методы алиасинга в Ruby относительно просты. Придуманный пример:

class Person
  def name
    puts "Roger"
  end
end

class User < Person
  alias :old_name :name
  def name
    old_name
    puts "Staubach"
  end
end

В этом случае выполнение User.new.name выдаст:

Roger
Staubach

Это работает, как ожидалось. Тем не менее, я пытаюсь присвоить псевдоним метод сеттера, который, очевидно, не является простым:

class Person
  def name=(whatever)
    puts whatever
  end
end

class User < Person
  alias :old_name= :name=
  def name=(whatever)
    puts whatever
    old_name = whatever
  end
end

При этом вызов User.new.name = "Roger" выведет:

Roger

Похоже, что новый метод с псевдонимом вызывается, а оригинальный - нет.

Что с этим случилось?

ps - я знаю о super и просто для краткости скажу, что я не хочу использовать его здесь

Ответы [ 4 ]

4 голосов
/ 26 февраля 2011

Я не думаю, что Ruby распознает old_name = whatever как вызов метода, когда ему не хватает ссылки на объект. Попробуйте:

def name=(whatever)
  puts whatever
  self.old_name = whatever
end

вместо (обратите внимание на self.)

1 голос
/ 28 марта 2012

Попробуйте это:

alias old_name= name=
1 голос
/ 26 февраля 2011

Вам нужно self.old_name = whatever, просто old_name - это местный.

0 голосов
/ 26 февраля 2011

Имеет ли псевдоним значение для установки?

class User < Person
  alias :old_name :name=
  def name=(whatever)
    old_name whatever
  end
end
...