如何在不影响超类的情况下重写 Ruby 子类中的变量?

2023-12-21

假设我有一个带有一些“静态”变量的类。我希望该类的子类能够覆盖这些变量而不影响原始类。使用类变量是不可能的,因为这些变量似乎在子类和超类之间共享:

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

超类中定义的方法会忽略子类中的常量。

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

class Foo
  def test; "a"; end
end

但这感觉就像是黑客攻击。我觉得使用类变量应该可以实现这一点,但我可能只是做错了。例如,当我子类化Object(这是默认情况下发生的情况):

class Foo < Object
  @@bar = 123
end

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

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


总结一下:如何在不影响超类的情况下重写子类中的变量?


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

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不影响超类的情况下重写 Ruby 子类中的变量? 的相关文章

  • Puppet 4.3.2 客户端节点无法通过 SSL 连接到 Puppet 服务器

    我刚刚按照以下方式对我的所有 Puppet 认证进行了彻底的再生官方文档中的指南 https docs puppetlabs com puppet 4 3 reference ssl regenerate certificates html
  • git,Heroku:预接收挂钩被拒绝

    我正在设置 git 存储库并尝试将其链接到 Heroku 当我运行命令时 git push heroku master 我收到 Counting objects 7 done Delta compression using up to 2
  • sudo:rvm:找不到命令 - Ubuntu 12.04 服务器上的 RVM 多用户安装

    我正在设置服务器 它是 Ubuntu 12 04 首先我安装了RVM多用户 me ubuntu curl L https get rvm io sudo bash s stable 然后在安装 RVM 后 按照安装提示 我将自己添加到 RV
  • 使用 String#sum 的 Ruby Anagram

    我已经解决了一个问题 要求您编写一个方法来确定所提供的数组中的哪些单词是字谜词 并将字谜词分组到输出中的子数组中 我已经使用似乎是典型的方式解决了这个问题 即对单词进行排序并根据其排序的字符将它们分组为散列 当我最初开始寻找一种方法来做到这
  • Rails JSON 多重嵌套关联

    我有一个对象 测试列表 其中包含问题和奖励问题 每个问题都有一个主题模型 我试图将它们全部包含在 JSON API 中 但我不断收到奇怪的难以理解的语法错误消息 我可以让它处理问题和主题或奖励问题和主题 但不能同时处理两者 这是我现在所拥有
  • 从delayed_job工作线程中排除队列

    在delayed jobs 中 可以为特定队列运行工作线程 我似乎找不到任何有关如何运行工作人员并排除特定队列的示例 文档 我试图让 1 名工作人员处理超高优先级的事情 1 名工作人员处理其余的事情 通过指定哪些队列与哪些工作人员相关来实现
  • vscode( vscode-ruby + rubocop ) 如何在保存时自动更正?

    环境 vscode 版本1 19 1 1 19 1 鲁博科普 0 52 1 Darwin mbp 16 7 0 Darwin 内核版本 16 7 0 2017 年 10 月 4 日星期三 00 17 00 PDT 根 xnu 3789 71
  • 如何在rails中使用like子句查询?

    我想在搜索关键字时获得 json 格式的数据 所以我使用 LIKE 子句并像这样查询 select from employees where fname like or mname like or lname like or usernam
  • 使 diff-lcs 的输出可读

    我正在使用 diff lcs gem 输出两个 html 内容体之间的差异 这是示例内容 版本一 p Paragraph one Sentence one p p Paragraph two Another sentence p p Par
  • 运行“bundle install”失败并要求我运行“bundle install”

    事实上 当从我从 git 存储库克隆的现有 Rails 应用程序内部运行时 所有与 gem 相关的命令都会导致相同的错误消息 bundle install Could not find tzinfo 0 3 27 in any of the
  • 在environment.rb中设置的常量在开发模式下消失

    了解 Rails 缓存如何工作的人可以真正帮助我 这是嵌套在 Rails Initializer run 块内的代码 config after initialize do SomeClass const set SOME CONST SOM
  • 如何将 --no-ri --no-rdoc 设置为 gem 安装的默认值? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将 no ri no rdoc 设置为 gem 安装的默认值 https stackoverflow com questions 1381725 how to make no ri no rdoc
  • 安装heroku toolbelt后出现Ruby错误

    我正在 win 7 32 位系统上使用 Heroku 但我没有管理员权限 我已经下载并安装了heroku工具带如下http community webfaction com questions 11803 heroku toolbelt h
  • ruby:类实例变量与实例变量

    我的想法是为来自不同国家的人们创建一个社区维基java因为读了很多解释 我无法理解任何东西 直到我真正尝试了一些东西 拼图的各个部分开始找到它们的位置 但我首先需要确保我做对了 来自这样的背景 我很困惑地发现 variable可能意味着两个
  • 尝试安装 Rails 时,执行 gem ... (Gem::RemoteFetcher::FetchError) 503 错误

    这是当我尝试使用 Ruby 2 1 1 和 RVM 执行 gem install Rails v 4 1 0 时出现的错误 错误 执行 gem 时 Gem RemoteFetcher FetchError 错误 响应服务不可用 503 ht
  • Bundler 找不到 gem“rack”的兼容版本:

    我是 Ruby 新手 但实际上如果我不想安装 Redmine 我就不需要它 我正在按照以下说明进行操作http www redmine org projects redmine wiki HowTo install Redmine on C
  • Ruby IMAP 库:如何显示文件夹中的所有邮件?

    我需要一个脚本来获取所有文件夹中的所有电子邮件 并对其及其附件进行本地备份 here https www ombulabs com blog ruby imap a comprehensive guide to interacting wi
  • Ruby 中的图像抓取

    如何使用 Nokogiri 抓取特定 URL 上存在的图像 如果有比 Nokogiri 更好的选择 请提出建议 css图像标签是 profilePic img 如果它只是一个 img 带有网址 PAGE http site com page
  • 如何将上传的二进制文件 (ASCII-8BIT) 嵌入 XML (UTF-8) 中?

    我有一个通过常规上传的文件form for 这给了我一个ActionDispatch Http UploadedFile我可以调用的 params 哈希中的对象 read来获取内容 我现在需要将该文件嵌入到 XML 文档中 我现在使用常规
  • 在 Rails 6 上添加外部 js 文件

    我在 app gt javascript gt packs 下创建了一个名为 custom 的文件夹 并放置以下外部 js metisMenu min js startmin js 然后在 app gt javascript gt pack

随机推荐