0

我正在做一项任务,要求我将一些产品加在一起并提供 10% 的折扣,前提是总价超过 60 英镑。我做了以下事情:

class Checkout
  def initialize (rules)
    @rules = rules
    @cart = []
  end

  def scan (item)
    if product == Product.find(item)
      @cart << product.clone
      #Clone preserves frozen state whereas .dup() doesn't if use would raise a
      #NoMethodError
    end
  end

  def total
    @cart = @rules.apply @cart

  end

def self.find item
  [item]
end

co = Checkout.new(Promotional_Rules.new)

co.empty_cart
co.scan(1)
co.scan(2)
co.scan(3)
puts "Total price: #{co.total}"
puts

co.empty_cart
co.scan(1)
co.scan(3)
co.scan(1)
puts "Total price: #{co.total}"
puts

co.empty_cart
co.scan(1)
co.scan(2)
co.scan(1)
co.scan(3)
puts "Total price: #{co.total}"
puts

但是,当我在其中运行时,irb我得到未定义的变量或方法产品。听起来有点愚蠢,但这应该可行。

4

1 回答 1

1

你使用了太多的等号

  def scan (item)
    # if product == Product.find(item) 
    if product = Product.find(item) # <--- should be this
      @cart << product.clone
      #Clone preserves frozen state whereas .dup() doesn't if use would raise a
      #NoMethodError
    end
  end

当然,然后你会得到一个不同的错误,因为find还不存在Product......我认为你试图在这里定义:

def self.find item # self should be changed to Product
  [item]
end

然后你会因为apply不存在而得到一个错误Promotional_Rules...


调试这些错误的最佳方法之一是跟踪堆栈跟踪。因此,对于最后一个错误,我收到以下消息:

test.rb:53:in `total': undefined method `apply' for #<Promotional_Rules:0x007f94f48bc7a8> (NoMethodError)
    from test.rb:72:in `<main>'

这基本上是说line 53你会发现apply还没有定义@rules哪个是Promotional_Rules. 查看Promotional_Rules您已明确将该方法定义为的类,apply_to_item而不是apply. 如果您继续跟踪和修复这样的兔子轨迹以获取堆栈跟踪,您将能够轻松调试您的程序!

于 2013-04-17T21:17:07.317 回答