0

我是红宝石的新手,但尽我所能去掌握它。问题是...

定义一个 BookInStock 类,该类表示一本书,该书具有 isbn 数、isbn 和价格作为浮点数,价格作为属性。构造函数应该接受 ISBN 号(一个字符串)作为第一个参数和价格作为第二个参数,如果 ISBN 号是空字符串或者价格小于或等于零。

包括这些属性的正确 getter 和 setter。包括一个方法 price_as_string,它返回带有前导美元符号和尾随零的图书价格,即价格 20 应显示为“$20.00”,价格 33.8 应显示为“$33.80”。

我的代码:-

class BookInStock
  #getters and setters
  attr_reader :isbn, :price

  def isbn= (isbn)
    if isbn == ''
      raise ArguementError.new("Must have an ISBN number")
    end
    @isbn = isbn
  end

  def price= (price)
    price = price.to_f
    if price <= 0
      raise ArguementError.new("Must have price")
    end
    @price = price
  end

  def initialize(isbn, price)
    self.isbn = @isbn
    self.price = @price
  end

  def self.price_as_string
    return "$" + sprinff("%.2f", @price)
  end
end

但是,当我尝试时出现错误

BookInStock.new('',9.00)

我得到一个Uninitialized constant BookInStock::ArgumentError (NameError)

在对错误进行一些研究后,它说我可能指的是不存在的类或模块?请帮忙,谢谢

4

1 回答 1

1

你犯了一个小错字。

ArgumentError不是ArguementError

请参考

http://apidock.com/ruby/ArgumentError

好吧。你还有几个问题。让我们一一进行。

你的构造函数:在你的构造函数里面你有代码,

self.isbn = @isbn
self.price = @price

当您使用字符编写变量时@,它指的是instance variable. 所以当你在写的时候self.isbn = @isbn,你实际上是在做@isbn=@isbn,而不是把传递给构造函数的参数赋值给@isbn. 所以你应该这样做:

self.isbn = isbn
self.price = price

接下来是你的price_as_string方法。当您将方法声明为self.method_name类方法时。使用类调用此类方法,如下所示 - BookInStock.price_as_string。但是这个method( @price)中使用的属性不是类变量而是实例变量。因此,您price_as_string应该是一个实例方法(没有编写self.),或者这self.price_as_string必须以价格作为参数。像这样 - self.price_as_string(price)。但是一个好的面向对象的设计是把它作为一个实例方法。

谢谢@arup

于 2013-10-15T04:49:22.173 回答