4

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

目前,我可以使用所有未继承的方法,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::UrlHelperMyClass. 我总是得到额外的方法:default_url_options?,default_url_options=default_url_options. 我认为无论是否使用 Rails,include 的行为都是相同的,所以我没有用 Rails 标记这个问题。

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

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

更新:

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

这是确切的代码(我已经删除了所有内容,但仍然得到相同的结果/问题)

# 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

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

4

1 回答 1

10

您可以执行以下操作:

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

如果您想包含 中定义的任何类方法MyClass,您可以执行以下操作:

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

这是定义了所有类/模块的工作示例

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"
于 2015-12-18T14:22:53.160 回答