2012-11-11 101 views
7

我有一类和模块,具有相同的名称:参考方法模块名称相同

module Pushover 
    def configure 
    .. 
    end 
end 

module MyModule 
    class Pushover 
    def blah 
     Pushover.configure 
    end 
    end 
end 

这并不工作,因为Pushover.configure呼叫定向到包含类。现在,一个明显的解决办法是重命名类。但是,该模块来自gem,并且该类符合DSL中要求的命名约定。所以理想情况下,他们应该保持不变。我也可以创建第二个助手类并通过它来调用,但这一切似乎都有些诡异。我的首选解决方案是直接引用模块方法。

围绕此区域的所有现有问题似乎都是在相反的方向上消歧 - 即他们希望获取类引用而不是模块。

当我指定Pushover时,有什么方法可以告诉Ruby我是指模块而不是类?

+0

为什么你必须命名模块'Pushover'和'Pushover'类在另一个模块中是一样的东西?这看起来像是在寻找麻烦,尤其是长期来说,如果你必须进行调试或维护。 –

+0

我同意。但是,我没有太多的选择。我正在使用其他人的宝石为其他人的应用程序提供补丁。如果我将类名更改为MyModule :: PushoverNotifier,那么使用它的“DSL”看起来很奇怪。 (这是用于备份gem btw。)。用户目前可以执行'notify_by Twitter'或'notify_by Mail'。所以'通过Pushover通知'似乎是一个逻辑扩展,而不是'notify_by PushoverNotifier',这是标准的一个例外。 –

+0

呃。那时候,由于别人的选择,当你回到角落时,维护代码变得很难看。我感到你的痛苦。 –

回答

11

如果你不希望将相对于当前范围不断抬头,只是使用绝对路径:

::Pushover.configure 
+0

啊!所以::有效地将你从当前范围中转义出来。我没有完全理解这一点。谢谢。 –

+1

它的工作原理与文件系统路径中的'/'完全相同。以'/开头的路径是绝对路径(或者相对于根目录),其他路径是相对的。在Ruby中,常量查找从当前范围开始,而'::'从“全局范围”开始(实际上,没有全局范围,它从'Object'类开始)。 –

相关问题