Ruby 根据对象的类使用正确的类变量
我有以下课程:Ruby 根据对象的类使用正确的类变量,ruby,Ruby,我有以下课程: class A @@one = {1 => "hen", 2 => "di", 3 => "tri", 4 => "tetra"} @@two = {5 => "penta", 6 => "hexa", 7 => "hepta", 8 => "octa", 9 => "nona"} def initialize(value) @value = value end
class A
@@one = {1 => "hen", 2 => "di", 3 => "tri", 4 => "tetra"}
@@two = {5 => "penta", 6 => "hexa", 7 => "hepta",
8 => "octa", 9 => "nona"}
def initialize(value)
@value = value
end
def to_s
value = @value
if value <=4
@@one[value]
else
@@two[value]
end
end
end
class B < A
@@one = {1 => "meth", 2 => "eth", 3 => "prop", 4 => "but"}
def initialize(value)
@value = value
end
end
我希望输出为:
hen
meth
但是A类变量@one被B类变量@one覆盖。所以我的输出是:
meth
meth
我尝试了类实例变量、类常量和类变量。但是这两种解决方案都不起作用。这个怎么样
class A
class << self; attr_accessor :one end
class << self; attr_accessor :two end
@one = {1 => "hen", 2 => "di", 3 => "tri", 4 => "tetra"}
@two = {5 => "penta", 6 => "hexa", 7 => "hepta", 8 => "octa", 9 => "nona"}
def initialize(value)
@value = value
end
def to_s
value = @value
if value <=4
self.class.one[value]
else
self.class.two[value]
end
end
end
class B < A
@one = {1 => "meth", 2 => "eth", 3 => "prop", 4 => "but"}
def initialize(value)
@value = value
end
end
puts A.new(1)
puts B.new(1)
A类
类“di”,3=>“tri”,4=>“tetra”}
@2={5=>“五”,6=>“六”,7=>“七”,8=>“八”,9=>“九”
def初始化(值)
@价值=价值
结束
def至美国
value=@value
如果值“meth”,则2=>“eth”,3=>“prop”,4=>“but”}
def初始化(值)
@价值=价值
结束
结束
把A.new(1)
将B.new(1)
关于这个主题的一篇好文章:试试这个(因为你说“我尝试了类实例变量、类常量和类变量。但这两种解决方案都不起作用”),我给出了一个使用类常量的解决方案,最适合这种特殊情况:
class A
ONE = {1 => "hen", 2 => "di", 3 => "tri", 4 => "tetra"}
TWO = {5 => "penta", 6 => "hexa", 7 => "hepta",
8 => "octa", 9 => "nona"}
def initialize(value)
@value = value
end
def to_s
value = @value
if value <=4
self.class::ONE[value]
else
self.class::TWO[value]
end
end
A类
一个={1=>“hen”,2=>“di”,3=>“tri”,4=>“tetra”}
两个={5=>“五”,六个=>“六”,七个=>“七”,
8=>octa,9=>nona}
def初始化(值)
@价值=价值
结束
def至美国
value=@value
如果值“meth”,则2=>“eth”,3=>“prop”,4=>“but”}
def初始化(值)
@价值=价值
结束
结束
解释:在这种情况下,子类覆盖父类中的内容,所以如果您想使用父类中的内容(由子类覆盖),您必须明确地说,按类名:(“:”操作符)好的,谢谢。一个问题,为什么
self.class::One[value]
中的class
?self
指的是调用此函数的对象,self.class
给出了该对象的类。当你把A.new(1)self.class::ONE
解释为A::ONE
,当你把B.new(1)self.class::ONE
解释为B::ONE
,我不太确定这是否是你想问的问题?
class A
ONE = {1 => "hen", 2 => "di", 3 => "tri", 4 => "tetra"}
TWO = {5 => "penta", 6 => "hexa", 7 => "hepta",
8 => "octa", 9 => "nona"}
def initialize(value)
@value = value
end
def to_s
value = @value
if value <=4
self.class::ONE[value]
else
self.class::TWO[value]
end
end
class B < A
ONE = {1 => "meth", 2 => "eth", 3 => "prop", 4 => "but"}
def initialize(value)
@value = value
end
end