Ruby: NoMethodError: неопределенный метод `‹‹' для nil:NilClass

Я получаю сообщение об ошибке "NoMethodError: неопределенный метод `‹‹' для nil:NilClass" при попытке добавить объект в пустой массив. Я думаю, что это связано с тем, что массив равен нулю, а не пуст, и это не позволяет мне добавлять новый объект.

Проблема возникает с последней строкой cashier.rule_set.add(apple_rule). Не уверен, что я реализую класс RuleSet и правильно инициализирую @rules.

class Rule
  attr_reader :sku, :quantity, :price

  def initialize(sku, quantity, price)
    @sku = sku
    @quantity = quantity
    @price = price
  end

end

class RuleSet
  attr_accessor :rules

  def initalize()
    @rules = []
  end

  def add(rule)
    @rules << rule
  end

  def rule_for_sku(sku)
    @rules.detect { |r| r.sku == sku }
  end
end

class Product

  attr_accessor :name, :price, :sku

  def initialize(name, price)
    puts "Added #{name}, which costs $#{price} to available inventory."
    @name = name
    @price = price
    @sku = (rand(100000) + 10000).to_s
  end

end

class Cashier

  attr_accessor :rule_set
  def initialize
    @cart = []
    @total_cost = 0
    @rule_set = RuleSet.new
  end

  def add_to_cart(product)
    puts "Added #{product.name} to your cart."
    @cart << product
  end

  def in_cart
    @cart.each_with_object(Hash.new(0)) {|item, counts| counts[item] += 1}
  end

  def checkout
    self.in_cart.each do |item, quantity|
      rule = self.rule_set.rule_for_sku(item.sku)
      if rule.present? && quantity >= rule.quantity
        total_cost += item.price
      end
    end
  end

end

##Testing

#Initialize list of available products and costs
apple = Product.new("apple", 5)
banana = Product.new("banana", 2)
grape = Product.new("grape", 3)

apple_rule = Rule.new(apple.sku, 3, 12)
cashier = Cashier.new

cashier.rule_set.add(apple_rule)

person Michael Sho Liu    schedule 22.03.2015    source источник
comment
У вас есть опечатка initialize в вашем классе RuleSet (инициализация), поэтому этот метод не вызывается, а @rules не устанавливается в пустой массив.   -  person mikej    schedule 23.03.2015
comment
Это действительно так; @mikej: Вы должны добавить ответ с той же информацией.   -  person Prakash Murthy    schedule 23.03.2015


Ответы (1)


У вас есть опечатка initialize в вашем классе RuleSet (инициализация), поэтому этот метод не вызывается, а @rules не устанавливается в пустой массив.

person mikej    schedule 22.03.2015