【问题标题】:Ruby `add_item': undefined method `>' for nil:NilClass (NoMethodError) [closed]Ruby`add_item':nil:NilClass(NoMethodError)的未定义方法`>'[关闭]
【发布时间】:2020-03-02 09:36:34
【问题描述】:

Ruby 新手。接收错误:

item_container.rb:14:in add_item': undefined method

我知道这个错误是什么意思,但不明白是什么原因造成的以及如何解决?在制作ClassMethodsInstanceMethods 并添加回调之前一切正常。

#item_container.rb
module ItemContainer

    module ClassMethods

        def min_price
            100 
        end

    end

    module InstanceMethods

        def add_item(item)
            unless item.price < self.class.min_price #<----- error line
                @items.push item
            end
        end

    end

    def self.included(base)
        base.extend ClassMethods
        base.class_eval do 
            include InstanceMethods
        end
    end

end
#init.rb
require_relative "item_container"
require_relative "cart"
require_relative "order"
require_relative "item"
require_relative "virtual_item"
require_relative "real_item"

item1 = VirtualItem.new({ :price => 10, :name => "car" })
item2 = RealItem.new({ :price => 100, :weight => 20, :name => "kettle" })
item3 = RealItem.new({ :price=> 10, :weight => 100, :name => "dishwasher" })

cart = Cart.new
cart.add_item item1
cart.add_item item2
class Item

    @@discount = 0.05

    def self.discount
        if Time.now.month == 2
            @@discount + 0.1
        else
            @@discount 
        end
    end

    def initialize(options={})
        @real_price     = options[:price]
        @name               = options[:name]
    end

    attr_accessor :real_price
    attr_reader   :name

    def info    
        yield(price)
        yield(name)
    end

    def price
        (@real_price - @real_price * self.class.discount) + tax if @realprice
    end

    private

        def tax
            type_tax = if self.class == VirtualItem
                1
            else
                2
            end
            cost_tax = if @real_price > 5 
                @real_price * 0.2
            else
                @real_price * 0.1
            end
            cost_tax + type_tax
        end

end


【问题讨论】:

  • item1.priceitem2.pricecart = Cart.new 行之前返回什么?我会在 VirtualItemRealItem 类中查找此错误的原因,具体取决于我的第一个问题的答案。
  • 报错说item.pricenil,而nil没有方法&lt;。但我不能告诉你为什么会这样,因为你没有提供minimal reproducible example。我的猜测是,在 VirtualItemRealItem 的初始化方法中,您永远不会设置 @price - 因此它仍然是 nil
  • 一件商品的折扣和税收价格
  • 不,具体来说,item1.priceitem2.price 的结果是什么?其中一个大概是nil,是哪一个?

标签: ruby nomethoderror


【解决方案1】:

你去吧:

def price
  (@real_price - @real_price * self.class.discount) + tax if @realprice
end

这里有一个错字,应该是if @real_price

【讨论】:

  • 请注意,如果错误已修复,price 仍将返回 nil,如果未设置 @real_price
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-16
  • 2023-03-06
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多