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

时间:2015-02-26 15:36:02

标签: ruby-on-rails ruby ruby-on-rails-3 syntax

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!表现得像一个类变量

2 个答案:

答案 0 :(得分:8)

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

在这种情况下,@count是一个类实例变量。换句话说,通过在类级方法中编写@count,您可以为该类分配一个变量。

通过在实例方法中编写@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"

答案 1 :(得分:4)

这可行的原因是因为类本身就是实例。所以你的变量就像一个类变量一样,是因为它是你类的一个实例变量。

这对于刚接触Ruby的人来说相当混乱,而且这也是一个问题,这是否是你在那里编程的正确行为。通常,类实例应使用double @。

声明

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