如何显示唯一的实例方法?

时间:2012-10-27 01:14:03

标签: ruby-on-rails ruby irb

有没有办法通过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"

3 个答案:

答案 0 :(得分:4)

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

URI.methods(false)
  

#=&gt; [: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)
  

#=&gt; [:REQUEST_URI]

<小时/> 如果这看起来太窄,你可以升级到一个超类。 URI个类基于URI::Generic

URI::HTTP.superclass
  

#=&gt; URI ::通用

同样如此:

URI::Generic.instance_methods(false)
  

#=&GT; [: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!,:merge,:+ ,: route_from,: - ,:route_to,   :normalize,:normalize!,:to_s,:==,:hash,:eql?,:component_ary,   :select,:inspect,:coerce]

答案 1 :(得分: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=
    ]

答案 2 :(得分:1)

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

class Object
  def own_methods
    self.class.instance_methods - self.class.superclass.instance_methods
  end
end