Ruby中的类实例变量和实例变量

时间:2016-03-04 05:57:23

标签: ruby oop

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 

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

3 个答案:

答案 0 :(得分:1)

class Var内(不是Class Var!),以及在类方法中,selfVarself.classClass 。在def instance_method内,self.classVar。类变量被设计为存在;但实例变量在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作为语言设计返回。