假设我将一些代码加载到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
)甚至不会列出我的方法。
答案 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)
的优势在于它显示了超类中包含的方法,模块中包含的方法以及动态定义的方法。
此外,您通常有一个对象正在检查而不是一个类。