Ruby on rails “@count”在Ruby中是实例变量还是类变量?

Ruby on rails “@count”在Ruby中是实例变量还是类变量?,ruby-on-rails,ruby,ruby-on-rails-3,syntax,Ruby On Rails,Ruby,Ruby On Rails 3,Syntax,在格式上,@count看起来像一个实例变量,但当我在“irb”(接口ruby)中加载它并键入四个命令代码时 class Counter def self.counted_new @count = 0 if @count.nil? @count += 1 new end def self.count @count end end @count终于变成了2!像类变量一样运行@count始终是一个实例变量,但如果在该上下文中声

在格式上,
@count
看起来像一个实例变量,但当我在“irb”(接口ruby)中加载它并键入四个命令代码时

class Counter
   def self.counted_new
      @count = 0 if @count.nil?
      @count += 1
      new
   end

   def self.count
      @count
   end
end

@count
终于变成了2!像类变量一样运行

@count
始终是一个实例变量,但如果在该上下文中声明,则它可以是类上的实例变量

在本例中,
@count
是一个类实例变量。换句话说,通过在类级方法中写入
@count
,可以为该类分配变量

通过在实例方法内部写入
@count
,您正在分配一个仅在该特定实例中可用的实例变量

如果用
@@count
声明一个变量,则会得到一个类变量

类变量和类实例变量之间的主要区别在于类变量保留在继承中

Counter.counted_new
Counter.count
Counter.counted_new
Counter.count
class-Foo
@@klass=“类级别变量”
@klass_instance=“类实例级变量”
结束
类Bar[:@klass_instance]
放置Foo.class_variables.inspect#=>[:@@klass]
放置Foo.instance_变量_get(:@klass_instance)
#=>“klass实例级变量”
放置Foo.class\u变量\u get(:@@klass)
#=>“类级别变量”
#类变量是继承的,但类实例变量不是继承的
放置Bar.instance_variables.inspect#=>[]
放置Bar.class_variables.inspect#=>[:@@klass]
#@klass变量在向下继承链中的所有类之间共享
#例如:
类变量集(:@@klass,“Foo”)
puts Bar.class_变量_get(:@@klass)#=>“foo”

之所以这样做,是因为类本身就是实例。因此,变量的行为类似于类变量的原因是,它是类的实例变量

对于刚接触Ruby的人来说,这相当令人困惑,这也是一个问题,即您在那里编程的行为是否正确。通常,类实例应使用双@声明

这里的人给出了详细的解释:

你能更具体地解释一下吗?你能教我如何快速识别这些病例吗?因为众所周知,
@blah
是一个实例变量instance变量用于实例。既然你做了Counter.count\u new,你就在类而不是实例上做了它。所以@count是一个实例,但是在类中。如果你想实例化一个像Counter.new.count\u new这样的instance,那么它应该在实例上,而不是在classnice上,Jesper解释了类变量和类实例变量之间的差异。类实例变量和类变量之间的另一个区别是类变量在实例方法,而不仅仅是类方法。@Nickginato我发现,如果我清除了名为
Foo
的计数器的新实例,则
Foo
中的
@count
实例与类中的
@count
实例不共享相同的数据字段。是这样吗?
class Foo
  @@klass = "class level variable"
  @klass_instance = "class instance level variable"
end

class Bar < Foo
end


puts Foo.instance_variables.inspect # => [:@klass_instance]
puts Foo.class_variables.inspect  # => [:@@klass]

puts Foo.instance_variable_get(:@klass_instance)
# => "klass instance level variable"
puts Foo.class_variable_get(:@@klass)
# => "class level variable"

# The class variable is inherited, but the class instance variable is not

puts Bar.instance_variables.inspect # => []
puts Bar.class_variables.inspect  # => [:@@klass]

# The @@klass variable is shared between all classes in the downward inheritance chain
# So for example:
Foo.class_variable_set(:@@klass, "foo")
puts Bar.class_variable_get(:@@klass) # => "foo"