gpt4 book ai didi

ruby-on-rails - `@count` 是 Ruby 中的实例变量还是类变量?

转载 作者:数据小太阳 更新时间:2023-10-29 07:42:26 25 4
gpt4 key购买 nike

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

def self.count
@count
end
end

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

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

@count 终于变成了2!充当类变量

最佳答案

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

关于ruby-on-rails - `@count` 是 Ruby 中的实例变量还是类变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28746547/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com