如何在IRB中获取我的可用方法列表?

时间:2014-01-18 19:24:07

标签: ruby

假设我将一些代码加载到irb中,如下所示:

class MyClass
  def m 
    #... something
  end
  def a
    #... something
  end
end

如何获取我的可用方法列表?如果我运行MyClass.new.methods,我会返回所有的可用instance methods

我想看看::m, :a

此外,如果我的methods未包含在class中,该怎么办?

def x 
  #... something
end
def z
  #... something
end

我如何看到可用的内容?调用self.methods(正在运行:methods)甚至不会列出我的方法。

2 个答案:

答案 0 :(得分:1)

使用Module#instance_methods执行以下操作:

  

返回一个数组,其中包含接收器中public和protected实例方法的名称。对于模块,这些是公共和受保护的方法;对于一个类,它们是实例(而不是单例)方法。如果没有参数,或者参数为false,则返回mod中的实例方法,否则返回mod和mod的超类中的方法。

class MyClass
  def m 
    #... something
  end
  def a
    #... something
  end
end
MyClass.instance_methods(false)
# => [:m, :a]

如果您在顶层定义方法,如下所示,它们将成为 Object 类的私有实例方法。所以我会使用Module#private_instance_methods

  

返回mod中定义的私有实例方法的列表。如果可选参数不为false,则包含任何祖先的方法。

def x 
  #... something
end
def z
  #... something
end

Object.private_instance_methods(false)
# => [:x, :z]

答案 1 :(得分:1)

这是我经常使用的一个小技巧,特别是如果我正在尝试使用我没写过的库中的对象:

obj = MyClass.new
obj.methods.sort - 0.methods   # => [:a, :m]

数字0有一小组方法,大多数只是你不想看的标准Ruby东西。您可以Object.new代替0,这样会更好,因为您可以看到succ等方法,但输入的内容会更多。

这优于MyClass.instance_methods(false)的优势在于它显示了超类中包含的方法,模块中包含的方法以及动态定义的方法。 此外,您通常有一个对象正在检查而不是一个类。