ruby - 如何在不影响父类(super class)的情况下覆盖 Ruby 子类中的变量?

标签 ruby

假设我有一个包含一些“静态”变量的类。我希望该类的子类能够在不影响原始类的情况下覆盖这些变量。使用类变量是不可能的,因为它们似乎在子类和父类(super class)之间共享:

class Foo
  @@test = "a"

  def speak; puts @@test; end
end

class Bar < Foo
  @@test = "b"
end

Bar.new.speak
# b

Foo.new.speak
# b

也不可能使用常量:

class Foo
  TEST = "a"

  def speak; puts TEST; end
end

class Bar < Foo
  TEST = "b"
end

Bar.new.speak
# a

Foo.new.speak
# a

父类(super class)中定义的方法会忽略子类中的常量。

明显的解决方法是为需要“可覆盖”的变量定义方法:

class Foo
  def test; "a"; end
end

但这感觉就像一个 hack。我觉得这应该可以使用类变量,而且我可能只是做错了。例如,当我将 Object 子类化时(默认情况下会发生这种情况):

class Foo < Object
  @@bar = 123
end

Object.class_variable_get(:@@bar)
# NameError: uninitialized class variable @@bar in Object

为什么不是 @@bar设置在 Object就像在我的Bar < Foo上面的例子?


总结一下:如何在不影响父类(super class)的情况下覆盖子类中的变量?

最佳答案

类常量做你想做的,你只需要以不同的方式使用它们:

class Foo
  TEST = "a"

  def speak
    puts self.class::TEST
  end
end

class Bar < Foo
  TEST = "b"
end

Bar.new.speak # => a
Foo.new.speak # => b

关于ruby - 如何在不影响父类(super class)的情况下覆盖 Ruby 子类中的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19382626/

相关文章:

.net - 是否有 Groovy 和 Grails 或 Ruby on Rails 的 .NET 等价物?

ruby - 在 Rspec 中测试 STDOUT 输出

ruby-on-rails - Nokogiri 忽略 utf-8 设置

ruby-on-rails - 如何使按钮在 erb 中充当链接?

Ruby LDAP 在 Rails 应用程序中不起作用,但在控制台中工作正常

html - CSS 中等效的 Ruby Truncate 方法

ruby - 以 DRY 方式跨 rspec 规范共享工厂

ruby - 在创建时将类实例收集到数组中

Ruby/Rails 根据每个项目的相似性对数组进行排序

ruby-on-rails - RVM gemset 创建不工作