Ruby类;错误:未初始化的常量BookInStock :: ArguementError(NameError)

时间:2013-10-15 04:45:02

标签: ruby

我是红宝石的新手,但我会尽力把握它。问题是......

定义一个BookInStock类,它代表一本书,其中包含isbn数字,isbn和书籍的价格作为浮点数,价格,作为属性。构造函数应该接受ISBN号(一个字符串)作为第一个参数,price作为第二个参数,如果ISBN号是空字符串或价格小于,则应该引发ArgumentError(Ruby的内置异常类型之一)或等于零。

为这些属性包含正确的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)

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

1 个答案:

答案 0 :(得分: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的类来调用。但是此方法(@price)中使用的属性不是类变量,而是实例变量。因此,price_as_string应该是实例方法(不使用self.编写),或者此self.price_as_string必须以价格作为参数。像这样 - self.price_as_string(price)。但是一个好的面向对象设计就是将它作为实例方法。

感谢@arup