Ruby中的别名设置器方法

问题描述:

Ruby中的别名方法相对简单。一个人为的例子: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,让我们只说为简便起见,我不想在这里使用它

我不认为将Ruby认识old_name = whatever作为一个方法调用时,它缺乏一个对象参考。尝试:

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

代替(注意self.

+0

谢谢,这工作。我也意识到,几乎没有理由,别名版本必须是一个setter,我可以直接传递参数给它,它会工作。 – jerodsanto 2011-02-25 22:46:11

+1

查看http://*.com/questions/44715/why-do-ruby-setters-need-self-qualification-within-the-class – 2011-02-25 22:49:15

你需要self.old_name = whatever,只是普通old_name是本地的。

别名是否有作为setter?

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

试试这个:

alias old_name= name=