ruby中的实例变量和类变量

Posted Liz-

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ruby中的实例变量和类变量相关的知识,希望对你有一定的参考价值。

定义很简单:实例变量@开头,类变量@@开头
看了一些文章和书,目前了解到的(其实还是不太懂,先记着吧,错了再改):
  1. 类变量:可以在类方法和类实例方法中访问,也能被子类继承,并且子类修改之后,父类的值也会更改。
    • 不同的子类都共享这个一个数值,包括子类的实例,都可以来修改这一个值。就理解成:不管自己还是子类的,什么函数都可以访问,也都可以改,改了之后也是大家共享。
  2. 实例变量:能被类方法访问,不能被继承,子类中赋值不会影响父类。
    • 子类如果修改了,其实是不是重新定义了一下又赋了新的值?
    • 这个其实更像应该和C++/C#类里的public变量,子类继承了之后可以重新赋值,代码还是一样用。
    • 但是实例变量不能被类实例方法访问就有点抽象了…被相似的名词弄的脑仁儿疼。
我也不太知道自己在说什么, 忘了就直接看代码:
 1 class Test
 2   @@class_var = 10
 3   @class_instance_var  = 1
 4   #类方法: 两种变量都可以访问
 5   def self.outclass_var
 6       puts @@class_var
 7   end
 8   def self.outclass_instance_var
 9       puts @class_instance_var
10   end
11   #类实例方法: 不能访问类实例变量
12   def outclass_var
13       puts @@class_var
14   end
15   def outclass_instance_var
16       puts @class_instance_var
17   end
18 end
19 
20 #如果两个变量不初始化,这里就打印不出来。不知道是不是版本的问题
21 puts Test.class_variables #=>@@class_var
22 puts Test.instance_variables #=>@class_instance_var
23 
24 #类变量,可以被子类共享且修改
25 class SubCls < Test
26   @@class_var = 12
27 end
28 
29 #可以看到现在类变量值都被修改了
30 Test.outclass_var #=>12
31 SubCls.outclass_var #=>12
32 
33 #子类无法继承父类的实例变量
34 Test.outclass_instance_var #=>1
35 SubCls.outclass_instance_var #=>空
36 
37 
38 #类实例方法不能访问实例变量
39 Test.new.outclass_var #=>12
40 Test.new.outclass_instance_var #
41 
42 #再看一下子类,和父类的情况相同
43 SubCls.new.outclass_var #=>12
44 SubCls.new.outclass_instance_var #

 

以上是关于ruby中的实例变量和类变量的主要内容,如果未能解决你的问题,请参考以下文章

python类实例变量和类变量

java-实例变量和类变量的区别

JAVA类与对象---实例变量与类变量的区别,实例方法和类方法的区别

Flutter/Dart 类实例和类变量

您是不是曾经在任何 Ruby 代码中使用过“类实例变量”?

实例变量和类变量