分配方法没有正确别名

Assignment methods are not aliased properly

考虑以下代码:

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!

旁注:别名 attr? 方法也很有效。

我的问题是:这是已知的 ruby 行为(禁止使用别名设置器)还是我遗漏了一些明显的东西?

Setter 方法需要明确的接收者。您的代码:

def attr= value ; a_attr= value ; end

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

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

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