首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby和继承

Ruby和继承
EN

Stack Overflow用户
提问于 2012-09-06 02:28:08
回答 2查看 126关注 0票数 0

我在试着理解继承:

代码语言:javascript
复制
class Car
  @@wheels = 4
  def wheel
    @@wheels
  end
end

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

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

代码语言:javascript
复制
moe = Car.new
larry = StretchLimo.new

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

我正在学习的Ruby教程说它应该是4。显然,Larry.whee应该返回6

顺便说一下,我添加了"wheel“和"whee”函数,这样我就可以看到这些值了。有人能解释一下这里出了什么问题吗?

EN

回答 2

Stack Overflow用户

发布于 2012-09-06 02:49:53

Ruby中的类变量是strangeconfusing

实现你想要的东西的惯用方法是这样的:

代码语言:javascript
复制
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的实例也可以看到这个变量。

票数 1
EN

Stack Overflow用户

发布于 2012-09-06 02:38:56

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

代码语言:javascript
复制
moe = Car.new
moe.wheel # should give 4
larry = StretchLimo.new
moe.wheel # should give 6

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12287618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档