请考虑以下代码
class CheckOut
@rules
@total = 0
@basket = Hash.new
def initialize(rules, discounts)
@total=0
#if i use the line below everything is ok.
#@basket = Hash.new
@rules = rules
end
def scan sku
price = @rules[sku]
if @basket.has_key?(sku) #I get NoMethodError: undefined method `has_key?' for nil:NilClass
@basket[sku] += 1
else
@basket[sku] = 1
end
@total += price
end
def total
@total
end
end
Run Code Online (Sandbox Code Playgroud)
如果我按原样运行代码,我在has_key上得到一个noMethodError?但是如果我在初始化中创建Hash一切正常.为什么我不能在声明中创建哈希?
当你在类体中定义一个实例变量时,它是一个定义的类实例变量CheckOut,它是一个实例Class,并且在实例中不存在CheckOut.相反,您需要在您initialize找到的实例变量中定义(因为initialize在新CheckOut实例的上下文中运行):
class CheckOut
def initialize(rules, discounts)
@total = 0
@basket = Hash.new
@rules = rules
end
...
end
Run Code Online (Sandbox Code Playgroud)
这是一个快速举例说明:
class Foo
@bar = "class bar!"
@baz = "class baz!"
def initialize
@bar = "instance bar!"
end
end
Foo.instance_variable_get(:@bar) #=> "class bar!"
Foo.new.instance_variable_get(:@bar) #=> "instance bar!"
Foo.instance_variable_get(:@baz) #=> "class baz!"
Foo.new.instance_variable_get(:@baz) #=> nil
Run Code Online (Sandbox Code Playgroud)
这也表明所有实例变量都是默认的nil,即使它们之前从未被引用过.这就是为什么你的错误是a NoMethodError for nil:NilClass而不是a NameError.
| 归档时间: |
|
| 查看次数: |
101 次 |
| 最近记录: |