请考虑以下代码:
class Cattr
attr_accessor :attr
alias_method :a_attr, :attr
alias_method :a_attr=, :attr=
def attr ; a_attr ; end
def attr= value ; a_attr= value ; end
end
ca = Cattr.new
#⇒ #<Cattr:0x000000018974b0>
ca.attr
#⇒ nil
ca.attr = 42
#⇒ 42
ca.attr
#⇒ nil
什么?问题不在于由attr_accessor
定义的别名方法,别名 getter 非常正常:
class Cattr
attr_accessor :attr
# alias_method :a_attr=, :attr=
alias_method :a_attr, :attr # still aliased
# def attr= value ; a_attr= value ; end
def attr ; a_attr ; end # still aliased
end
ca = Cattr.new
#⇒ #<Cattr:0x000000018974b0>
ca.attr
#⇒ nil
ca.attr = 42
#⇒ 42
ca.attr
#⇒ 42 # sic!
Sidenote :别名attr?
方法效果也很好。
我的问题是:它是一种已知的ruby行为(禁止别名设置者),还是我遗漏了一些明显的东西?
答案 0 :(得分:2)
Setter方法需要显式接收器。你的代码:
def attr= value ; a_attr= value ; end
没有调用setter a_attr=
;它正在为局部变量a_attr
赋值。
要做你想做的事,你需要做:
def attr= value; self.a_attr= value; end