在Ruby中,我们有简单的方法来使用local_variables
和global_variables
方法获取所有局部变量,全局变量。
我们可以使用Object.constants列出常量
但是有一种内置的方法可以列出所有Object方法吗?
类似这样的东西:
def foo() end
def bar() end
def baz() end
# As `Array.new.methods' or `Array.instance_methods` returns all the methods of an Array object...
# Code to return all the methods defined above # => [:foo, :bar, :baz]
在IRB中,我可以写:
def foo() end
p [self.methods.include?(:foo), self.respond_to?(:foo)]
在IRB中,输出为[true, true]
,但在文件中,对标准输出的输出为[false, false]
类似地,如果我运行以下代码:
def foo() end
puts Object.new.methods.include?(:foo)
在IRB中,我得到true
,如果保存在文件中,我得到false
这是link,并没有太大帮助:
How to list all methods for an object in Ruby?
仅因为它谈到获取类或模块的方法。但是我想列出在顶部self对象中定义的方法。
答案 0 :(得分:3)
我能找到的最接近的方法是在main
对象上调用private_methods
,以false
作为参数
返回obj可访问的私有方法的列表。如果全部 参数设置为false,只有接收者中的那些方法 列出。
def foo
"foo"
end
def bar
"bar"
end
def baz
"baz"
end
p private_methods(false)
# [:include, :using, :public, :private, :define_method, :DelegateClass, :foo, :bar, :baz]
如果省略该参数,则还将获得在Kernel
或BasicObject
中定义的所有私有方法。
为了进一步优化列表,您可以选择为Object
定义的方法:
p private_methods(false).select{|m| method(m).owner == Object}
#=> [:DelegateClass, :foo, :bar, :baz]
仅保留:DelegateClass
,因为它是在顶级范围内定义的,就像:foo
,:bar
和:baz
一样。
答案 1 :(得分:1)
您将获得false
,因为默认情况下在顶级上下文中定义的方法是私有的。
def foo; end
p self.private_methods.include?(:foo)
# => true
我不确定这是否记录在任何地方。
为了获取所有方法,包括私有方法,您需要执行以下操作:
all_methods = self.methods | self.private_methods
尝试使用repl.it:https://repl.it/@jrunning/DutifulPolishedCell