Ruby中的别名Setter方法

时间:2011-02-25 22:30:01

标签: ruby alias

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

按预期工作。但是,我正在尝试使用一个setter方法,这显然不是直截了当的:

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 个答案:

答案 0 :(得分:4)

我不认为Ruby在缺少对象引用时会将old_name = whatever识别为方法调用。尝试:

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

代替(注意self.

答案 1 :(得分:1)

您需要self.old_name = whatever,只需old_name是本地的。

答案 2 :(得分:1)

试试这个:

alias old_name= name=

答案 3 :(得分:-1)

别名是否是一个setter?

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