2014-12-18 6 views
0

Я получаю сообщение об ошибке со следующим примером при запуске программы.`initialize ': неправильное количество аргументов (1 для 0)

Ошибка чтения как такового:

burger.rb:8:in `initialize': wrong number of arguments (1 for 0) (ArgumentError) 
    from burger.rb:19:in `new' 
    from burger.rb:19:in `<main>' 

любая помощь в этом нуб, код ниже:

$toppings = false 

class Burger 
    AVAILABLE_TOPPINGS = ["lettuce", "tomato", "onion", "cheese"] 

    attr_reader :options 

    def initialize 
     @toppings = [] 
    end 

    def order 
     print "how many burgers would you like? " 
     number = gets.chomp 
     puts "#{number} burgers coming right up boss!" 
    end 
end 

burger = Burger.new("lettuce") 

burger.order 
+3

Вы пытаетесь передать аргумент ('' lettuce '') инициализатору, который не принимает никаких аргументов. – Linuxios

+0

Хотя название юмористическое, это не поможет никому понять, о чем идет речь, что важно. Заголовки используются, чтобы помочь найти вопросы, когда люди делают поиск в Интернете, поэтому наличие чего-то более релевантного этому вопросу поможет другим найти ответ. –

ответ

1

ошибка говорит вам, что метод initialize ожидает 0 аргумент, в то время как вы даете ему 1 ("lettuce" в Burger.new("lettuce")).

Вам нужно сделать initialize ожидает один аргумент:

def initialize(options) 
    @toppings = [] 
    @options = options 
end 
+0

Большое вам спасибо! - Как я уже сказал, только начинаю здесь. Это имеет смысл. Ценить это! – jblades

2

Как уже сказали, что ваша инициализатор не ожидает никаких аргументов, но вы даете ему lettuce. Если вы используете рубин 2.1 или более поздней версии, я предложил бы использовать именованные аргументы:

class Burger 
    TOPPINGS = %i[lettuce tomato onion cheese] 

    attr_reader :toppings 

    def initialize(toppings: []) 
    @toppings = TOPPINGS & toppings 
    end 
end 

Это позволяет сделать, чтобы Burger.new(toppings: [:lettuce]), которые я чувствую, намного более читаемым.

0
$toppings = false 

код запах. Глобалы, как правило, не нужны, и их следует использовать только тогда, когда вы абсолютно уверены, что они нужны. Когда вы впервые изучаете язык OO, я думаю, что лучше избегать их и узнавать о переменном охвате.

В этом случае вы не используете его в образец кода, но вы используете:

@toppings = [] 

(который не используется снова в другом месте). Не рекомендуется указывать глобальную переменную так же, как переменную экземпляра, потому что ее слишком просто использовать, когда вы имеете в виду другую, и вводите ошибку.

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