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#Integer
、Kernel#Float
、Kernel#Array
、Kernel#String
、Kernel#require
、Kernel#puts
、Kernel#load
、Kernel#p
, Kernel#gets
, 等等
† 除非它们只打算在模块体内调用,在这种情况下它们在 Module
中定义,例如Module#attr_reader
、Module#attr_writer
、Module#attr_accessor
、Module#define_method
等
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#Integer
、Kernel#Float
、Kernel#Array
、Kernel#String
、Kernel#require
、Kernel#puts
、Kernel#load
、Kernel#p
, Kernel#gets
, 等等
† 除非它们只打算在模块体内调用,在这种情况下它们在 Module
中定义,例如Module#attr_reader
、Module#attr_writer
、Module#attr_accessor
、Module#define_method
等