从使用示例实现类

时间:2014-01-03 16:24:40

标签: ruby class

我需要通过构建“Car”类来使以下代码正常运行。我觉得我必须忽视一些简单的事情。任何帮助,将不胜感激。 #表示预期输出

# Make the following code functional by building a Car class
c = Car.new("blue")
puts c.color # blue
puts c.repaint_count # 0
c.paint("red")
c.paint("green")
puts c.repaint_count # 2
puts c.color # green

这就是我所做的:

class Car
  @@repaint_count = 0
  def initialize(color)
    @color = color
  end

  def self.paint(color)
    @color = color
    @@repaint_color += 1
  end

  def self.color
    @color
  end
end

我想我被c.color / c.paint抛出了:我应该定义这些方法并将它们设置为等于类还是别的?我想我缺少关于类和继承的东西。

3 个答案:

答案 0 :(得分:4)

  

我想我被c.color / c.paint抛出了:我应该这样做   定义这些方法并将它们设置为类或类似的东西   别的?我想我缺少关于类和继承的东西。

我认为事实上你在这个阶段担心这些事情会让你过于复杂。问题不在于继承。虽然在某些方面它的指定很差,但是可能会错误地解释问题文本并将一些属性分配给除实例之外的类。

首先,你得到的问题是你希望你实现一个Car类,并且有内部状态来跟踪当前颜色及其改变的次数。你有部分误解了重绘计数并使其成为一个类变量。它需要是一个实例变量 - 它应该是特定汽车重新涂漆的次数,而不是任何汽车重新涂漆的次数。虽然示例数字相同,但不同之处在于问题要求c.repaint_count不是Car.repaint_count,而cCar实例因此,您希望将计数存储为实例变量 - 在构造函数中将其设置为0

您的访问者代码中存在类似的混淆。 Ruby使用self有点令人困惑 - 它改变了代码中上下文的含义。如果您将def self.paint更改为def paint,而color也是如此,那么通过上一段的更改,您已经完成了很多工作。

最后一件事,您需要实现repaint_count访问器,类似于您使用color的方式(同样,没有self.会使其成为类方法)

答案 1 :(得分:3)

您似乎混淆了类和实例。 cCar的实例,而不是类Car本身。除非您想要计算整个repaint_count类中的总Car,否则不应使用类变量@@repaint_count,而应使用实例变量。您的paint方法是一种类方法,并且定义不明确。另外,定义主体看起来像你随机放了一些东西。

class Car
  attr_reader :color, :repaint_count
  def initialize color
    @color = color
    @repaint_count = 0
  end
  def paint color
    @color = color
    @repaint_count += 1
  end
end

答案 2 :(得分:2)

嗯,这看起来像是一个家庭作业问题,我不打算为你写。不过我会给你一些指示。

你创建/打开一个这样的类。

class Foo
end

当您打开这样的类时,您可以将其设置为立即接受参数,如下所示:

class Foo

  attr_accessor :bar, :bar_counter
  def initialize(arg_1)
    @bar = arg_1
    @bar_counter = 0
  end

  # And add methods with any name like so.

  def increase_bar
    @bar_counter += 1
  end

  def change_bar(arg)
    @bar = arg
  end
end

这将解释attr_accessor,attr_reader,attr_writer https://stackoverflow.com/a/4371458/2167965

之间的区别

人们对Codecademy有各种各样的看法,但在我看来,它非常适合教这样的基本语法。还有Ruby Koans和Ruby Test First。

我的建议是从codecademy开始学习语法,然后转到Test First来充实这些概念。