任何人都可以告诉我有关类变量和类实例变量之间的区别吗?类变量和类实例变量之间的区别?
79
A
回答
132
类变量(@@
)在该类及其所有后代中共享。类实例变量(@
)不被类的后代共享。
类变量(@@
)
让我们有一个类Foo有一个类变量@@i
和存取方法进行读取和写入@@i
:
class Foo
@@i = 1
def self.i
@@i
end
def self.i=(value)
@@i = value
end
end
而派生类:
class Bar < Foo
end
我们看到,Foo和酒吧有@@i
相同的值:
p Foo.i # => 1
p Bar.i # => 1
和不断变化的@@i
在一个改变它在两个:
Bar.i = 2
p Foo.i # => 2
p Bar.i # => 2
类实例变量(@
)
让我们用一个类实例va做一个简单的类可变结构@i
和存取读取和写入@i
:
class Foo
@i = 1
def self.i
@i
end
def self.i=(value)
@i = value
end
end
而派生类:
class Bar < Foo
end
我们看到,虽然酒吧继承了@i
访问器,它不继承@i
本身:
p Foo.i # => 1
p Bar.i # => nil
我们可以设置Bar的@i
而不影响Foo的@i
:
Bar.i = 2
p Foo.i # => 1
p Bar.i # => 2
59
首先,你必须明白,类实例太 - Class
类的实例。
一旦你理解了,你可以理解一个类可以拥有与它相关的实例变量,就像一个普通的(读取:非类)对象一样。
Hello = Class.new
# setting an instance variable on the Hello class
Hello.instance_variable_set(:@var, "good morning!")
# getting an instance variable on the Hello class
Hello.instance_variable_get(:@var) #=> "good morning!"
注意,上Hello
实例变量是对Hello
hello = Hello.new
# setting an instance variable on an instance of Hello
hello.instance_variable_set(:@var, :"bad evening!")
# getting an instance variable on an instance of Hello
hello.instance_variable_get(:@var) #=> "bad evening!")
# see that it's distinct from @var on Hello
Hello.instance_variable_get(:@var) #=> "good morning!"
在另一方面甲类变量一个实例完全无关的且不同于一个实例变量是一种以上两者的组合,因为它可通过Hello
本身及其实例以及Hello
及其实例的子类获得:
HelloChild = Class.new(Hello)
Hello.class_variable_set(:@@class_var, "strange day!")
hello = Hello.new
hello_child = HelloChild.new
Hello.class_variable_get(:@@class_var) #=> "strange day!"
HelloChild.class_variable_get(:@@class_var) #=> "strange day!"
hello.singleton_class.class_variable_get(:@@class_var) #=> "strange day!"
hello_child.singleton_class.class_variable_get(:@@class_Var) #=> "strange day!"
很多人都说,避免class variables
,因为上面的奇怪的行为,并建议使用class instance variables
代替。
相关问题
- 1. 类别和实例变量
- 2. **变量和变量[] []之间的区别?
- 3. python类实例变量和类变量
- 4. 类别级别定义的类别变量和变量之间的区别是什么
- 5. 实例和类变量
- 6. 浮点变量和双变量数据类型之间的区别
- 7. Ruby中的类实例变量和实例变量
- 8. Ruby - 变量和@variable之间的区别
- 9. Ruby中的类变量实例变量
- 10. 实例变量的类别扩展
- 11. Ruby类级别的实例变量
- 12. Objective-C:类别中的实例变量
- 13. 目标C类别的实例变量
- 14. 赋值:属性和类变量之间的区别?
- 15. 使用__init__和设置类变量之间的区别
- 16. TypeScript - 私有变量和受保护变量之间的区别
- 17. jQuery缓存元素,$变量和变量之间的区别?
- 18. if(!!变量)和if(变量)之间的区别?
- 19. PLSQL绑定变量和主机变量之间的区别
- 20. 类型的实例变量
- 21. 最终变量和编译时间常量之间的区别
- 22. 找出哈希和数组之间的变量类别和区别
- 23. Backbone.js实例与类变量
- 24. 访问类实例变量
- 25. 重载类实例变量
- 26. NSString类实例变量
- 27. `coerce`和类型变量的实例
- 28. 类别变量
- 29. 类的实例变量是对象的类变量吗?
- 30. 区别:%% a和%variable%变量之间的区别是什么?
为什么使用类方法返回实例变量? 你经常遇到这种情况吗? – sekmo 2017-05-13 10:25:21
@sekmo这些示例中的访问器返回属于类的_class实例变量_或属于类层次结构的_class variables_。它们不会返回属于该类实例的纯_实例变量_。术语“实例变量”,“类实例变量”和“类变量”相当混乱,不是吗? – 2017-05-13 16:03:32