让父类的方法访问子类的常量

Tim*_*Tim 25 ruby constants

例如:

class Animal

 def make_noise
    print NOISE
 end

end

class Dog < Animal
    NOISE = "bark"
end

d = Dog.new
d.make_noise # I want this to print "bark" 
Run Code Online (Sandbox Code Playgroud)

我如何完成上述工作?目前它说

uninitialized constant Animal::NOISE
Run Code Online (Sandbox Code Playgroud)

Phr*_*ogz 27

我认为你真的不想要一个常数; 我认为你想在类上有一个实例变量:

class Animal
  @noise = "whaargarble"
  class << self
    attr_accessor :noise
  end
  def make_noise
    puts self.class.noise
  end
end

class Dog < Animal
  @noise = "bark"
end

a = Animal.new
d = Dog.new
a.make_noise  #=> "whaargarble"
d.make_noise  #=> "bark"
Dog.noise = "WOOF"
d.make_noise  #=> "WOOF"
a.make_noise  #=> "whaargarble"
Run Code Online (Sandbox Code Playgroud)

但是,如果您确定需要常量:

class Animal
  def make_noise
    puts self.class::NOISE
    # or self.class.const_get(:NOISE)
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 您不需要通过const_get.你可以做`self.class :: NOISE`. (4认同)

Pat*_*ann 5

没有类实例变量的一种方法:

class Animal

 def make_noise
   print self.class::NOISE
 end

end

class Dog < Animal
  NOISE = "bark"
end

d = Dog.new
d.make_noise # prints bark
Run Code Online (Sandbox Code Playgroud)