`@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
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