2

有没有办法通过 IRB 查看实例可用的类特定方法?

我创建了一个 URI 类的实例,然后按下Tab查看我可以使用哪些方法,但我看到了大约 100 种可能性:

  1.9.3p286 :001 > require 'uri'
=> true

1.9.3p286 :002 > uri = URI('http://game.dl.a-steroids.com/TrafficServer/')
=> #<URI::HTTP:0x00000000eae390 URL:http://game.dl.a-steroids.com/TrafficServer/>

  1.9.3p286 :008 > uri.
  Display all 102 possibilities? (y or n)

我只想过滤该实例的特定方法,例如此处描述的方法:http ://www.ruby-doc.org/stdlib-1.9.3/libdoc/uri/rdoc/URI.html或以下:

  1.9.3p286 :003 > uri.host
=> "game.dl.a-steroids.com"

1.9.3p286 :006 > uri.path
=> "/TrafficServer/"

1.9.3p286 :007 > uri.scheme
=> "http"
4

3 回答 3

4

URI是一个模块。它不能有实例,也没有实例方法。要查看直接定义在 上的模块方法URI,请执行以下操作:

URI.methods(false)

# => [:scheme_list, :split, :parse, :join, :extract, :regexp, :encode_www_form_component, :decode_www_form_component, :encode_www_form, :decode_www_form]

URI(...)创建的是URI:HTTP. 要查看直接定义在 上的实例方法URI::HTTP,请执行以下操作:

URI::HTTP.instance_methods(false)

# => [:request_uri]


如果这看起来太窄,您可以升级到超类。URI类基于URI::Generic,

URI::HTTP.superclass

# => URI::通用

所以对它做同样的事情:

URI::Generic.instance_methods(false)

#=> [:default_port, :scheme, :host, :port, :registry, :path, :query, :opaque, :fragment, :parser, :component, :set_scheme, :scheme=, :userinfo=, :user =, :password=, :set_userinfo, :set_user, :set_password, :userinfo, :user, :password, :set_host, :host=, :hostname, :hostname=, :set_port, :port=, :set_registry, :registry =, :set_path, :path=, :set_query, :query=, :set_opaque, :opaque=, :set_fragment, :fragment=, :hierarchical?, :absolute?, :absolute, :relative?, :merge!, :合并、:+、:route_from、:-、:route_to、:normalize、:normalize!、:to_s、:==、:hash、:eql?、:component_ary、:select、:inspect、:coerce]

于 2012-10-27T01:35:54.487 回答
1

您可以将以下内容添加到您的 .irbrc 文件中,然后所有对象都将获得一个 #own_methods 类,您可以使用该类来获取该列表。

class Object
  def own_methods
    self.class.instance_methods - self.class.superclass.instance_methods
  end
end
于 2012-10-27T01:31:42.020 回答
1

我经常在 IRB 中使用它:

uri.methods - Object.methods

=> [
      :+, :-, :absolute, :absolute?, :coerce, :component, :component_ary,
      :default_port, :fragment, :fragment=, :hierarchical?, :host,
      :host=, :hostname, :hostname=, :merge, :merge!, :normalize,
      :normalize!, :opaque, :opaque=, :parser, :password, :password=,
      :path, :path=, :port, :port=, :query, :query=, :registry,
      :registry=, :relative?, :request_uri, :route_from, :route_to,
      :scheme, :scheme=, :select, :set_fragment, :set_host,
      :set_opaque, :set_password, :set_path, :set_port, :set_query,
      :set_registry, :set_scheme, :set_user, :set_userinfo, :user,
      :user=, :userinfo, :userinfo=
    ]
于 2012-10-27T01:20:53.657 回答