分配方法没有正确别名
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
考虑以下代码:
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