在Ruby示例之一中,我看到以下代码:
require 'net/http'
req = Net::HTTP::Get.new( "http://localhost:8080/" )
req.basic_auth( "user", "password" )
Run Code Online (Sandbox Code Playgroud)
知道Ruby类实际实现此basic_auth方法或动态生成的最简单方法是什么?我检查过public_methods,Net::HTTP::Get它肯定不存在.但是如何检查实际实现它的类?
通常,您将使用该Kernel#method方法获取相关方法的Method对象,然后您将使用该Method#owner方法询问Method对象的定义位置.
所以,
req.method(:basic_auth).owner
# => Net::HTTPHeader
Run Code Online (Sandbox Code Playgroud)
应该回答你的问题.
除此之外,在这种特殊情况下,这将无法工作,因为它req是一个Net::HTTP::Get对象,并Net::HTTP::Get覆盖该method方法,意味着完全不同的东西.特别是,它不需要参数,因此上面的代码实际上会引发一个ArgumentError.
但是,由于Net::HTTP::Get继承Object并Object混入Kernel,将方法绑定到以下实例是合法Kernel#method的Net::HTTP::Get:
Kernel.instance_method(:method).bind(req).(:basic_auth).owner
# => Net::HTTPHeader
Run Code Online (Sandbox Code Playgroud)
所以,有你的答案:方法定义于Net::HTTPHeader.