赋值方法没有正确的别名

时间:2016-03-22 10:11:04

标签: ruby metaprogramming alias attr-accessor

请考虑以下代码:

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行为(禁止别名设置者),还是我遗漏了一些明显的东西?

1 个答案:

答案 0 :(得分:2)

Setter方法需要显式接收器。你的代码:

def attr= value ; a_attr= value ; end

没有调用setter a_attr=;它正在为局部变量a_attr赋值。

要做你想做的事,你需要做:

def attr= value; self.a_attr= value; end