`initialize':错误的参数数量(1表示0)

时间:2014-12-18 15:41:58

标签: ruby-on-rails ruby

运行程序时,我遇到以下示例的错误。

错误如下:

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>'

此noob赞赏任何帮助,代码如下:

$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 个答案:

答案 0 :(得分:2)

正如其他人所说,你的初始化程序期望没有参数但是你给它lettuce。如果您正在使用ruby 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]),我觉得它更具可读性。

答案 1 :(得分:1)

错误告诉您方法initialize需要0参数,而您给它1("lettuce"中的Burger.new("lettuce"))。

你需要让initialize期待一个论点:

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

答案 2 :(得分:0)

$toppings = false

是代码味道。全局通常不是必需的,只有在您完全确定需要它们时才能使用。当你第一次学习OO语言时,我认为最好避免它们并学习变量范围。

在这种情况下,您不要在示例代码中使用它,但确实使用了:

@toppings = []

(在其他地方也没有使用过)。将全局变量命名为与实例变量相同并不是一个好主意,因为当你指的是另一个时,它太容易使用了一个,并引入了一个bug。