Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 根据对象的类使用正确的类变量_Ruby - Fatal编程技术网

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