`@count` 是实例变量还是 Ruby 中的 class 变量?

Is the `@count` an instance variable or class variable in Ruby?

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

   def self.count
      @count
   end
end

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

Counter.counted_new
Counter.count
Counter.counted_new
Counter.count

@count终于变成2了!表现得像一个 class 变量

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

在这种情况下,@count 是一个 class 实例变量。换句话说,通过在 class 级别方法中编写 @count ,您正在为该 class.

分配一个变量

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

如果您使用 @@count 声明一个变量,您将得到一个 class 变量。

class变量和class实例变量的主要区别在于class变量在继承中被保留。

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"

之所以可行,是因为 类 本身就是实例。所以你的变量表现得像 class 变量的原因是因为它是你的 class.

的实例变量

这对于 Ruby 的新手来说相当混乱,而且这是否是您在那里编程的正确行为也是一个问题。通常 class 个实例应该用双 @ 声明。

这里的人给出了很好详细的解释: Using Instance Variables in Class Methods - Ruby