Ruby:如何列出主作用域中声明的方法
Ruby:如何列出主作用域中声明的方法
在Ruby里,直接写在主作用域(没嵌套在任何类或模块里)的方法,其实会被定义成Object类的私有实例方法。这就是你之前尝试的几种方式都找不到它们的原因——要么你在找公共方法/类方法,要么没考虑到私有实例方法的范畴。
要列出这些方法,有两种实用的方式:
查看当前
main对象的私有方法列表
在主作用域里,self就是main对象,你可以用private_methods获取它的私有方法,再过滤目标方法:private_methods.grep(/asdf|qwer/)如果只想看你自己定义的方法(排除继承来的私有方法),可以加上
false参数:private_methods(false).grep(/asdf|qwer/)查看
Object类的私有实例方法
主作用域的方法本质上是Object的私有实例方法,所以也可以直接查询Object的私有实例方法:Object.private_instance_methods.grep(/asdf|qwer/)同样,要只看直接定义在
Object里的方法,加false参数排除继承项:Object.private_instance_methods(false).grep(/asdf|qwer/)
顺便解释下你之前尝试的方式为什么没生效:
methods/self.methods:返回的是当前对象的公共方法,而主作用域方法是私有的,所以看不到。Object.methods:返回的是Object类的类方法,和你定义的实例方法不是同一类。Object.instance_methods:返回的是Object类的公共实例方法,不包含私有方法。
实际验证示例:
def asdf puts "asdf" end def qwer puts "qwer" end # 方式1输出 puts private_methods(false).grep(/asdf|qwer/) # => [:asdf, :qwer] # 方式2输出 puts Object.private_instance_methods(false).grep(/asdf|qwer/) # => [:asdf, :qwer]
这样就能精准找到你在主作用域定义的方法了!
备注:内容来源于stack exchange,提问作者Svintoo
相关产品推荐
相关产品推荐

