首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我不能在声明的地方创建我的私有变量?

为什么我不能在声明的地方创建我的私有变量?
EN

Stack Overflow用户
提问于 2012-04-30 06:09:25
回答 1查看 102关注 0票数 3

考虑以下代码

代码语言:javascript
运行
复制
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

如果我按原样运行代码,会在has_key上得到一个noMethodError吗?但是如果我在initialize中创建Hash,一切都会正常工作。为什么我不能在声明中创建Hash?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-30 06:17:27

当您在类体中定义实例变量时,它是在CheckOut上定义的类实例变量,它是Class的实例,并且不存在于CheckOut的实例中。相反,您需要在您发现的initialize中定义实例变量(因为initialize在新CheckOut实例的上下文中运行):

代码语言:javascript
运行
复制
class CheckOut
  def initialize(rules, discounts)
    @total = 0
    @basket = Hash.new
    @rules = rules
  end
  ...
end

这里有一个简单的例子来进一步说明这一点:

代码语言:javascript
运行
复制
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

这还表明,所有实例变量都默认为nil,即使它们以前从未被引用过。这就是为什么你的错误是一个NoMethodError for nil:NilClass而不是一个NameError

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10376440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档