【问题标题】:Get child constant in parent method - Ruby在父方法中获取子常量 - Ruby
【发布时间】:2012-03-30 19:58:45
【问题描述】:

在 Ruby 中,当我通过孩子调用父母的方法时,是否可以获取孩子的常量?

例子:

class Tester
  class Parent

    def go
      EWOCK
    end
  end

  class Child < Parent
    EWOCK = "EWOCKS rule"

  end
end

然后致电Tester::Child.new.go 并希望“EWOCKS 规则”回来?

[编辑 3/31]

哇,我真的很抱歉,伙计们。我完全搞砸了解释。

  • Parent 应该是 Child,Child 应该从 base 继承。
  • 呼叫应该是孩子而不是父母

再次,非常抱歉,并感谢那些试图理解我可怕的文章的人。

现在已经修复了。

【问题讨论】:

  • 您的示例没有显示通过孩子调用父母的方法。我误会了吗?
  • @Wayne:我猜Parent应该继承自Child
  • @Wayne Conrad - 真的很抱歉,我已经更新了解释。
  • @NiklasB。真的很抱歉 - 我已经更新了解释

标签: ruby inheritance


【解决方案1】:

编辑:这个答案是正确的,尽管韦恩的方法是解决问题的更红宝石的方式。

是的。

您的实现将工作,因为父尝试在本地解析 EWOK。父级没有定义 EWOK。但是,您可以告诉 Ruby 专门查看调用该方法的实际实例的类,以获取 EWOK。

工作:

class Parent
  def go
    self.class::EWOK
  end
end

class Child < Parent
  EWOK = "Ewoks Rule"
end

class Child2 < Parent
  EWOK = "Ewoks are ok, I guess"
end

bob = Child.new
bob.go  # => "Ewoks Rule"

joe = Child2.new
joe.go  # => "Ewoks are ok, I guess"

这里发生了什么: 在 Parent 的 'go' 中,“self” 将引用实际调用 'go' 的对象的实例。即,鲍勃(一个孩子)或乔(一个孩子2)。 self.class 获取该实例的实际类 - 在 bob 的情况下为 Child,在 joe 的情况下为 Child2。 然后,self.class::EWOK 将从正确的类中检索 EWOK。

【讨论】:

  • 不错。我不知道我的答案比你的更像 Ruby 方式。
  • 我认为通常最好通过方法使用鸭子类型,而不是父类中花哨的类解析魔法。不过,它偶尔也有用途。
  • 这就是我投赞成票的原因。给猫剥皮的方法不止一种。
【解决方案2】:

为了让父类能够访问子类中定义的常量,请将该常量包装在一个方法中。然后应用正常的继承规则:

class Parent

  def ewok
    "Ewoks are lame"
  end

end

class Child < Parent

  def ewok
    "Ewoks rule"
  end

end

p Parent.new.ewok    # Ewoks are lame
p Child.new.ewok     # Ewoks rule

如果常量初始化成本很高(例如,一个大哈希),则将其定义在常量中,但通过方法访问它:

class Parent

  EWOK = {
    # Enormous hash...
  }

  def ewok
    EWOK
  end

end

【讨论】:

  • 也可以使用类变量代替方法。
  • @Niklas,真的。有一次,我花了一周的大部分时间来解决因免费使用类变量而造成的混乱。我更喜欢把它们放在玻璃后面,并贴上“紧急情况下”的标签。
猜你喜欢
  • 1970-01-01
  • 2012-02-04
  • 1970-01-01
  • 2013-08-04
  • 2012-12-16
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多