2016-03-04 147 views
0
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是内部实例方法。这背后的逻辑解释是什么?Ruby中的类实例变量和实例变量

Var.class_method #=> "instance variable" "class instance variable" 
Var.new.instance_method #=> "class instance variable" nil 

这是正确的实例变量不会被子类继承吗?这是为什么?

+0

_Sidenote_:'nil'在“Var.new.instance_method”执行的结果很混乱,因为它a)应该出现在“类实例变量”之前,并且b)在“puts”中根本不会出现。 – mudasobwa

+0

它如下。 (你必须用@替换我的(@),因为&符号开始SO用户名,并且SO只允许每个注释一个)。 (@)(@)class_variable = 1; (@)class_instance_variable = 2; def my_method; (@)instance_variable = 3;结束;结束' –

+0

@FrederickCheung我不同意这是重复的。 OP实际上询问“'@ instance_variable”是否在实例方法内部。这背后的逻辑解释是什么?“这是由于OP误解实例变量范围概念的缘故。 – mudasobwa

回答

1

class Var(不Class Var!),以及类方法中,selfVarself.classClassdef instance_method内,self.classVar。类变量被设计为在那里;但实例变量在Var上定义为Class类的实例。如果您有v = Var.new,那么@instance_variable正在查看v上的@instance_variable,这不在那里。

不,变量永远不会被继承;只有方法是。变量表示对象状态,并且对于每个对象都是特定的;继承是两个类之间的关系。

0

类变量在类,其实例,子类和它们的实例之间共享。

实例变量仅在单个实例中占用作用域。未定义时,返回nil作为语言设计。

1

实际上,您还没有根据Var的实例定义实例变量。

▶ Var.class_variables 
#⇒ [:@@class_instance_variable] 
▶ Var.instance_variables 
#⇒ [ :@instance_variable ] 
▶ Var.new.instance_variables 
#⇒ [] 

你定义了什么是:在Var类实例变量类变量上VarClass类的一个实例。这是因为您在类范围中声明了它。

要定义Var的实例的实例变量,一个应该调用@iv从相应的范围,即-从的Var实例方法中的一个内:

▶ class Var 
▷ def iv 
▷  @iv ||= 42 
▷ end 
▷​ end 
▶ Var.new.instance_variables 
#⇒ [] 
# the above is because instance variables are lazily instantiated 
▶ v = Var.new 
▶ v.iv 
#⇒ 42 
▶ v.instance_variables 
#⇒ [ :@iv ]