我是红宝石的新手,但我会尽力把握它。问题是......
定义一个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)
在对错误进行一些研究后,它说我可能指的是一个不存在的类或模块? 请帮助,谢谢
答案 0 :(得分:1)
你犯了一个小错字。
其ArgumentError
而非ArguementError
请参阅
好的。你也有更多的问题。让我们一个接一个。
您的构造函数: 在构造函数中,您有代码
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