【问题标题】:Assignment methods are not aliased properly [duplicate]分配方法没有正确别名[重复]
【发布时间】:2016-03-22 10:11:04
【问题描述】:

考虑以下代码:

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

【问题讨论】:

  • @jörg-w-mittag 好吧,现在很好。这个问题如何与链接的问题重复?请指出那里的答案,它适用于这个问题的答案。

标签: ruby metaprogramming alias attr-accessor


【解决方案1】:

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

def attr= value ; a_attr= value ; end

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

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

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

【讨论】:

  • 谢谢。我刚刚发现的另一件事是 setter 需要唯一的参数。被包装为“通用”*args,它会导致 [val] 传递给 setter 而不是 val
猜你喜欢
  • 2018-07-19
  • 2022-01-24
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-03
  • 1970-01-01
相关资源
最近更新 更多