如何列出Ruby的top self Object中定义的所有方法?

时间:2019-06-12 19:48:05

标签: ruby

在Ruby中,我们有简单的方法来使用local_variablesglobal_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对象中定义的方法。

2 个答案:

答案 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]

如果省略该参数,则还将获得在KernelBasicObject中定义的所有私有方法。

为了进一步优化列表,您可以选择为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