【问题标题】:Ruby and Inheritance红宝石和继承
【发布时间】:2012-08-30 12:54:20
【问题描述】:

我正在尝试理解继承:

class Car
  @@wheels = 4
  def wheel
    @@wheels
  end
end

class StretchLimo < Car
  @@wheels = 6
  def whee
    @@wheels
  end
  def turn_on_television
  end
end

我像这样实例化一些对象:

moe = Car.new
larry = StretchLimo.new

当我执行moe.wheel 时,我得到6,而我期待4

我正在关注的 Ruby 教程说它应该是 4Larry.whee 显然应该返回 6

顺便说一句,我添加了“wheel”和“whee”函数,以便查看值。谁能解释这里出了什么问题?

【问题讨论】:

  • 欢迎来到stackoverflow。请正确格式化您的代码。
  • ruby 中的类变量很奇怪且令人困惑。不使用它们可能是最简单的。

标签: ruby class inheritance


【解决方案1】:

@@ 是一个类变量,因此它在从给定类和所有派生类实例化的所有对象之间共享。因为 Ruby 是解释型的,所以在您实例化 StretchLimo 对象之前,它不应该查看任何 StretchLimo 代码,所以如果您执行以下操作:

moe = Car.new
moe.wheel # should give 4
larry = StretchLimo.new
moe.wheel # should give 6

因为当StretchLimo 被解释时,它会将@@wheels 类变量更新为6。另一方面,如果您声明“wheels”时只有一个“@”(@wheels),它将是特定于对象本身的实例变量,您将获得您喜欢的行为。

【讨论】:

  • 这不是真的。 moe.wheel 在第二行给出 6。试试看。
  • 取决于目录结构和解释方式。如果两个类都定义在同一个文件中并从那里加载,我会得到 moe.wheel -> 6,但如果我强制解释器按顺序加载这些类,情况并非如此。无论如何,首选方法是使用实​​例变量
【解决方案2】:

Ruby 中的类变量是strangeconfusing

实现您想要的一种惯用方式是:

class Car
  def wheels
    4
  end
end

class StretchLimo < Car
  def wheels
    6
  end
end

Car.new.wheels #=> 4
StretchLimo.new.wheels #=> 6

发生的事情是类变量在类的所有实例之间共享。因为StrechLimoCar 的子类,StrechLimo 的实例也请参见此变量。

【讨论】:

猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
相关资源
最近更新 更多