如何列出 class 的所有方法(不是扩展和包含的方法)

How to list all methods of a class (not Extended and Included methods)

使用 Ruby 2.2.1,如何列出仅在 class / 文件中定义的 class 的所有方法(最好是字符串名称数组),其中 includeextend 方法被过滤掉。我也想区分 class 和实例方法。

目前,我可以使用 MyClass.methods(false) 获取所有未继承的方法,但这仍然包括属于 include 模块的方法。

明确地说,我有:

class MyClass < BaseClass
  extend AnotherBaseClass
  include MyModule

  def foo
  end

  def bar
  end
end

我想得到:

somecodethatreturnssomething
#=> ['foo', 'bar']
# Not including BaseClass, AnotherBaseClass, and ModuleClass methods

更新:

当我在单独的 irb 控制台中 运行 时,@Wand Maker 的答案是正确的。但是,我仍然有一个问题,特别是我将 ActionView::Helpers::UrlHelper 包含在 MyClass 中。我总是得到额外的方法:default_url_options?default_url_options=default_url_options。我认为无论 Rails 与否,include 的行为都是一样的,所以我没有用 Rails.

标记这个问题

我什至在 MyClass 的文件末尾添加了 byebug,这样我就可以检查 class 和 运行 MyClass.singleton_methods(false) 或 运行 MyClass.instance_methods(false)。但它们仍然包括这三种不需要的方法。

我可以手动从数组中删除这三个额外的方法,这样我就可以获得我的 class 的动态方法列表,但我只是担心将来如果有更新或将新方法添加到 class(不知不觉)的东西。

更新:

这 3 种方法似乎只在 Rails 3 中添加(我正在处理的项目),但在 Rails 4 中没有添加(正如我和@Wand Maker 测试过的)。

这是准确的代码(我已经删除了所有内容,但仍然得到相同的代码 results/problem)

# lib/my_class.rb
class MyClass
  include ActionView::Helpers::UrlHelper

  def welcome
    puts 'Hello Jules!'
  end

  def farewell
    puts 'Goodbye Jules!'
  end
end

byebug

或者我可以删除该文件:my_class.rb(并将整个代码复制并粘贴到 rails console

但是,仍然遇到同样的问题。

您可以执行如下操作:

MyClass.instance_methods(false)
#=> [:foo, :bar]

如果您想包含 MyClass 中定义的任何 class 方法,您可以这样做:

MyClass.instance_methods(false) + MyClass.singleton_methods(false)

这是工作示例,所有 classes/modules 已定义

class BaseClass
  def moo
  end
end

module AnotherBaseClass
  def boo
  end
end

module MyModule
  def roo
  end
end

class MyClass < BaseClass
  extend AnotherBaseClass
  include MyModule

  def self.goo
  end

  def foo
  end

  def bar
  end
end

p MyClass.instance_methods(false) + MyClass.singleton_methods(false)
#=> [:foo, :bar, :goo]

p RUBY_VERSION
#=> "2.2.2"