class Var
@instance_variable = "instance variable"
@@class_instance_variable = "class instance variable"
def self.class_method
puts @instance_variable
puts @@class_instance_variable
end
def instance_method
puts @instance_variable
puts @@class_instance_variable
end
end
类方法可以访问类实例和实例变量。但是实例方法只能访问类实例变量。 @instance_variable
在实例方法中是nil。这背后的逻辑解释是什么?
Var.class_method #=> "instance variable" "class instance variable"
Var.new.instance_method #=> "class instance variable" nil
实例变量不会被子类继承,这是正确的吗?那是为什么?
答案 0 :(得分:1)
在class Var
内(不是Class Var
!),以及在类方法中,self
为Var
,self.class
为Class
。在def instance_method
内,self.class
是Var
。类变量被设计为存在;但实例变量在Var
上定义为Class
类的实例。如果您有v = Var.new
,那么@instance_variable
正在查看@instance_variable
上的v
,而不是pear install --alldeps php_codesniffer
。
不,变量永远不会被继承;只有方法。变量代表对象状态,并且特定于每个对象;继承是两个类之间的关系。
答案 1 :(得分:1)
实际上,您还没有在Var
的实例上定义实例变量。
▶ Var.class_variables
#⇒ [:@@class_instance_variable]
▶ Var.instance_variables
#⇒ [ :@instance_variable ]
▶ Var.new.instance_variables
#⇒ []
您定义的内容包括:Var
上的类变量和Var
上的类实例变量,Class
类的实例。这是因为您在类范围中声明了它。
要在Var
的实例上定义实例变量,应该从相应的范围调用@iv
,即 - 来自{{的一个实例方法内部1}}:
Var
答案 2 :(得分:0)
类变量在类,实例,子类及其实例之间共享。
实例变量仅在单个实例中占用范围。未定义时,它将nil
作为语言设计返回。