如何列出 class 的所有方法(不是扩展和包含的方法)
How to list all methods of a class (not Extended and Included methods)
使用 Ruby 2.2.1,如何列出仅在 class / 文件中定义的 class 的所有方法(最好是字符串名称数组),其中 include
和 extend
方法被过滤掉。我也想区分 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"
使用 Ruby 2.2.1,如何列出仅在 class / 文件中定义的 class 的所有方法(最好是字符串名称数组),其中 include
和 extend
方法被过滤掉。我也想区分 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"