如何在父/父类中访问孩子的实例变量

时间:2018-10-12 10:43:02

标签: ruby class inheritance instance-variables

我有以下示例:

class A
   @Values = {}

   def initialize()
     @Values.each{ |_key, _val|
        puts("Key: #{_key}, Val: #{_val}")
     }
   end
end

class B < A
  @Values = { "Test1": "1", "Test2": "2"}

  def initialize()
    super()
  end
end

我的问题:

B.new()

不创建任何输出-因此,类B中的@Values在类A中不可用。为什么?如何访问它们?

=========更新========= 谢谢您的回答!

@Mosab Muhammad:是的-我真的不确定何时使用{}以及何时使用do end ...我将看看何时使用。

  

{}(通常用于单行块)或do..end(用于   多行块)。

是的-我读到这样做有点像铁路惯例,但还有更多-{}并最终表现出不同。

@@是一种选择,但我认为编辑类变量不是一个好主意-正如您提到的那样,它确实会带来讨厌的副作用。

@Aleksei Matiushkin-谢谢!我将研究self.class.instance_variable_get,并查看其行为以及是否可以解决我的问题!

非常感谢!

2 个答案:

答案 0 :(得分:1)

您的问题@Values from class B are not available in class A. Why?的答案是: 在类级别声明的实例变量无法在对象级别访问。

问题How can i access them?的答案是:您可以在@@values方法中声明类变量@values而不是实例变量initialize

您的示例将更改为:

class A
  @@values = {}

  def initialize()
    @@values.each{ |_key, _val|
      puts("Key: #{_key}, Val: #{_val}")
    }
  end
end

class B < A
  @@values = { "Test1": "1", "Test2": "2"}
end

现在B.new将输出

Key: Test1, Val: 1
Key: Test2, Val: 2

另一个答案:

class A

   def initialize()
     @values ||= {}
     @values.each{ |_key, _val|
        puts("Key: #{_key}, Val: #{_val}")
     }
   end
end

class B < A

  def initialize()
    @values = { "Test1": "1", "Test2": "2"}
    super()
  end
end

注意:类变量在相关类之间共享,并且可以从子类中覆盖。这意味着如果您覆盖B类中的类变量@@values,则A类中的@@values将被覆盖。

另一个注意事项:{}(通常用于单行块)或do..end(用于多行块)。

例如: 使用

def initialize()
  @Values.each{ |_key, _val| puts("Key: #{_key}, Val: #{_val}") }
end

代替:

def initialize()
  @Values.each{ |_key, _val|
    puts("Key: #{_key}, Val: #{_val}")
  }
end

OR

使用

def initialize()
  @Values.each do |_key, _val|
    puts("Key: #{_key}, Val: #{_val}")
  end
end

代替:

def initialize()
  @Values.each{ |_key, _val|
    puts("Key: #{_key}, Val: #{_val}")
  }
end

答案 1 :(得分:-1)

嗯,这段代码有很多问题,所以我会回答确切的问题。如果希望从类和即时上下文均可访问该变量,请使用 class变量

{
   "message" :"{\"foo\": \"42\", \"bar\": \"less interesting data\"}"
}