我有以下示例:
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,并查看其行为以及是否可以解决我的问题!
非常感谢!
答案 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\"}"
}