如何知道方法是否已添加到类中

时间:2014-04-25 09:23:15

标签: ruby methods

我使用库rest_client来查询http服务器:

r = RestClient.get 'http://stackoverflow.com'

除非服务器返回错误代码,否则r是带有http答案的字符串:

r # => I get the HTML, no HTTP headers, no HTTP status code
r.class # => "String"

正如文档指出的那样,r响应以下方法:

r.code
r.headers
r.raw_header

其他http特定的东西。我怎样才能获得添加内容的证据?

2 个答案:

答案 0 :(得分:1)

您可以看到方法是否已添加到实例中,您将其方法与其类的实例方法进行比较:

r.methods - r.class.instance_methods
#  => [:args, :args, :body, :body, :net_http_res, :net_http_res, :code, :headers, :raw_headers, :cookies, :return!, :description, :follow_redirection] 

str = 'a'
str.methods - str.class.instance_methods
# => []

答案 1 :(得分:1)

查看source code表明REST Client通过调用extend向结果字符串添加方法:

def Response.create body, net_http_res, args
  result = body || ''
  result.extend Response
  result.net_http_res = net_http_res
  result.args = args
  result
end

这会添加RestClient::Resonse的实例方法和包含的RestClient::AbstractResponse

API文档:

顺便说一下,您始终可以使用Object#method查找方法:

r = RestClient.get 'http://stackoverflow.com'
r.method(:code)
#=> #<Method: String(RestClient::AbstractResponse)#code>
r.method(:args)
#=> #<Method: String(RestClient::Response)#code>

require 'json'
r.method(:to_json)
#=> #<Method: String(JSON::Ext::Generator::GeneratorMethods::String)#to_json>