如何向已引入模块添加内容?能否重开引入模块嵌套更多类?
关于重新打开已引入模块添加嵌套类的问题
首先明确说:在Ruby里,你完全可以重新打开已经定义过的模块来追加新的嵌套类/模块,根本不会出现“第二个模块声明覆盖第一个”的情况——除非你的代码写法有问题。
举个实际的例子,你可以分两次定义同一个命名空间的模块:
# 第一次定义,添加ThingOne module Shelf module Things class ThingOne def hello "I'm ThingOne" end end end end # 第二次打开同一个模块,添加ThingTwo module Shelf module Things class ThingTwo def hello "I'm ThingTwo" end end end end
这时候你完全可以正常调用两个类:
puts Shelf::Things::ThingOne.new.hello # 输出 "I'm ThingOne" puts Shelf::Things::ThingTwo.new.hello # 输出 "I'm ThingTwo"
那你为什么会遇到“覆盖”的问题?大概率是写法上的小失误:
- 比如不小心把
module Things写成了class Things,导致重新定义了类而非打开模块; - 或者在不同的作用域(比如不同的文件、不同的模块嵌套层级)里定义,导致命名空间不匹配;
- 也有可能是你误以为模块会被覆盖,但实际上只是没正确加载代码(比如某个文件没
require进来)。
既然你说这不是你真正想问的问题,已经发布了后续提问,那等你后续的具体问题出来后,我们可以再针对性分析~
内容的提问来源于stack exchange,提问作者Chowlett
相关产品推荐
相关产品推荐

