2011-08-20 64 views
1

几个月前,我一直在使用一些Ruby库(我不记得哪一个正好,不幸)红宝石营救不断失踪?

我一直惊讶地看到它让我初始化它的实例有类似的东西:

Lib::SOMETHING(args) 

我真的不明白它是如何工作的。我非常确定它应该是动态的(没有SOMETHING常量),如constant_missing模块方法,或者ConstantMissing异常得到某种处理。

你能请指教吗?

回答

5

没有魔法存在于理论上,它只是看起来陌生:

class A 
    def self.I_LOOK_LIKE_A_CONST(arg) 
    puts arg 
    end 
end 

A::I_LOOK_LIKE_A_CONST("Hi") # => "Hi" 

Net::HTTP确实有其Proxy类类似的东西,它允许类的调用Net::HTTP::Proxy(...),它同样定义:

def HTTP.Proxy(p_addr, p_port = nil, p_user = nil, p_pass = nil) 

对于班级方法来说,冲突线可以互换使用::.来调用它们。

+0

令人惊叹:)不知何故,它早早没有出现在我的脑海里。万分感谢! –

+0

我也发现了const_missing方法(适用于类和模块) - method_missing的完全副本。当我发布这个问题时,我真的不认为这种方法可能是现实:) –

+0

我想如果你需要更动态的东西,你也可以使用'const_missing'。但是在Net :: HTTP :: Proxy的情况下,显然没有必要这样做。 – emboss