【问题标题】:Class instance variables and instance variables in Ruby [duplicate]Ruby中的类实例变量和实例变量[重复]
【发布时间】:2016-03-04 05:57:23
【问题描述】:
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 在实例方法中为零。这背后的逻辑解释是什么?

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

实例变量不被子类继承是否正确?这是为什么呢?

【问题讨论】:

  • 旁注nil 在显示的Var.new.instance_method 执行结果中令人困惑,因为它 a) 应该出现在“类实例变量”之前并且 b) 不会出现完全在puts
  • 如下。 (您必须将我的 (@) 替换为 @,因为 & 号以 SO 用户名开头,并且每条评论只允许一个。)class A; (@)(@)class_variable = 1; (@)class_instance_variable = 2; def my_method; (@)instance_variable = 3; end; end
  • @FrederickCheung 我不同意这是重复的。 OP 实际上询问“@instance_variable 在实例方法中为零。这背后的逻辑解释是什么?”这是由于 OP 完全误解了实例变量作用域的概念。
  • 你的问题是错误的。@@ 是一个类变量。不是你给它贴上的标签,每次你写@@var 时你都弄错了。你用@ 放在顶部的变量是一个类实例变量,所以你没有很好地标记它。以及您标记为 ok 的其他 @var 实例变量。

标签: ruby oop


【解决方案1】:

class Var(不是Class Var!)内部,以及在类方法内部,selfVarself.classClass。在def instance_methodself.class 内部是Var。类变量被设计在那里;但是实例变量在Var 上定义为Class 类的实例。如果您有v = Var.new,那么@instance_variable 正在查看v 上的@instance_variable,它不存在。

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

【讨论】:

    【解决方案2】:

    其实你根本没有在Var的实例上定义实例变量。

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

    您定义的内容是:Var 上的类变量和 Var 上的类实例变量,Class 类的实例。这是因为您在 类范围 中声明了它。

    要在Var 的实例上定义一个实例变量,应该从各自的作用域调用@iv,即——从Var 的实例方法之一内部: p>

    ▶ 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 ]
    

    【讨论】:

      【解决方案3】:

      一个类变量在一个类、它的实例、子类和它们的实例之间共享。

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

      【讨论】:

        猜你喜欢
        • 2014-09-21
        • 2012-08-27
        • 2013-03-24
        • 1970-01-01
        • 2021-07-29
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        • 2011-02-21
        相关资源
        最近更新 更多