2013-10-15 3 views
0

Я новичок в рубине, но стараюсь изо всех сил ее понять. Ques is ...Рубины; Ошибка: неинициализированная константа BookInStock :: ArguementError (NameError)

Определите класс BookInStock, который представляет книгу с номером isbn, isbn и стоимостью книги как число с плавающей запятой, цена, как атрибуты. Конструктор должен принять номер ISBN (строка) в качестве первого аргумента и цены как второй аргумент и должен поднять ArgumentError (один из встроенных типов исключений Ruby), если номер ISBN является пустой строкой или если цена меньше, чем или равна нулю.

Включите соответствующие геттеры и сеттеры для этих атрибутов. Включите метод 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)

После выполнения некоторых исследований по ошибке он говорит что я могу ссылаться на класс или модуль, которые не существуют? PLease help, thanks

+0

Def инициализации (ISBN, цена) self.isbn = self.price ISBN = цена, которую я на самом деле это не то, что было напечатано выше – user2752770

ответ

1

Вы сделали небольшую опечатку.

Его ArgumentError не ArguementError

Пожалуйста, обратитесь

http://apidock.com/ruby/ArgumentError

Хорошо. У вас еще немного проблем. Давайте возьмем их один за другим.

конструкторе: Внутри вашего конструктора у вас есть код,

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

Когда вы пишете переменную с @ характером, он referes к instance variable. Поэтому, когда вы пишете self.isbn = @isbn, вы фактически делаете @[email protected], и вы не назначаете аргумент, переданный конструктору, @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

+0

Yes..you являются rigt..But есть некоторые более ошибки OP сделали ...скажите также те. –

Смежные вопросы