URI() 不是通常的 Ruby receiver.message 格式,它是什么?

URI() is not the usual Ruby receiver.message format, what is it?

Ruby core URI module 的调用方式很奇怪:

URI("http://example.com")

不是通常的receiver.message格式,所以Ruby在这里调用和做什么?它是 URI.new() 的快捷方式还是 Kernel.URI() 或完全不同的东西?

是的 Kernel::URI

http://rxr.whitequark.org/mri/source/lib/uri/common.rb#1228

我怀疑你试图存根。我试图自己这样做,但我没有设法用 rspec 来解决它。我最终使用了 WebMock gem.

正常的消息发送格式。如果您未指定显式接收者,Ruby 将假定为 self.

的隐式接收者

然而,在这种特殊情况下,接收者实际上是无关紧要的,因为该方法不会对 self 做任何有趣的事情(调用私有方法或访问实例变量)。此类方法使用 self 的隐式接收者调用但实际上不对 self 执行任何操作,通常被定义为 Kernel†[= 的私有实例方法44=],它被混合到 Object 中,几乎在每个 Ruby 对象的祖先链中。

因此,在这种特殊情况下,方法是 Kernel#URI。其他类似的方法还有Kernel#IntegerKernel#FloatKernel#ArrayKernel#StringKernel#requireKernel#putsKernel#loadKernel#p, Kernel#gets, 等等


除非它们只打算在模块体内调用,在这种情况下它们在 Module 中定义,例如Module#attr_readerModule#attr_writerModule#attr_accessorModule#define_method