📅  最后修改于: 2023-12-03 15:34:45.861000             🧑  作者: Mango
在 Ruby 中,类方法是在类中定义的方法,可以直接通过类名调用,而不需要先创建类的实例。本文将介绍如何列出 Ruby 中的所有类方法。
methods
方法Ruby 提供了一个 methods
方法,可以列出一个类的所有实例方法和类方法。
class MyClass
def self.my_class_method
# ...
end
def my_instance_method
# ...
end
end
puts MyClass.methods(false) # => [:my_class_method]
在上面的例子中,我们定义了一个名为 MyClass
的类,并在其中定义了一个名为 my_class_method
的类方法和一个名为 my_instance_method
的实例方法,methods(false)
返回类的所有类方法的数组, 如果传入true,还会返回实例方法的数组。
singleton_methods
方法如果你想要列出一个单例类的所有类方法,你可以使用 singleton_methods
方法。
obj = Object.new
def obj.my_singleton_class_method
# ...
end
puts obj.singleton_methods(false) # => [:my_singleton_class_method]
在上面的例子中,我们首先创建了一个名为 obj
的对象,然后给这个对象定义了一个名为 my_singleton_method
的单例方法,singleton_methods(false)
返回该对象的所有类方法的数组,传入true,则同时包括实例方法。
ancestors
方法ancestors
方法可以列出一个类的祖先链,包括自身和包含自身的模块,这些模块中定义的方法也会在列表中出现,并且会按照继承的顺序排列。
class A
def self.a_class_method
# ...
end
end
module M
def m_instance_method
# ...
end
end
class B < A
include M
end
puts B.ancestors.flat_map(&:methods).sort.uniq # => [:!, :!=, :!~, :<=>, :==, :===, :=~, :__id__, :__send__, :a_class_method, :ancestors, :append_features, :class_eval, :class_variable_defined?, :class_variable_get, :class_variable_set, :class_variables, :clone, :const_defined?, :const_get, :const_missing, :const_set, :define_singleton_method, :display, :dup, :enum_for, :eql?, :equal?, :extend, :freeze, :frozen?, :hash, :include, :included_modules, :inspect, :instance_eval, :instance_exec, :instance_method, :instance_methods, :instance_of?, :instance_variable_defined?, :instance_variable_get, :instance_variable_set, :instance_variables, :is_a?, :itself, :kind_of?, :method, :methods, :m_instance_method, :module_eval, :name, :nil?, :object_id, :prepend_features, :private_class_method, :private_instance_methods, :private_method_defined?, :private_methods, :protected_instance_methods, :protected_method_defined?, :protected_methods, :public_class_method, :public_instance_method, :public_instance_methods, :public_method, :public_method_defined?, :public_methods, :remove_class_variable, :remove_instance_variable, :remove_method, :respond_to?, :send, :singleton_class, :singleton_method, :singleton_methods, :superclass, :taint, :tainted?, :tap, :then, :to_enum, :to_s, :trust, :untaint, :untrust, :untrusted?]
在上面的例子中,我们定义了一个名为 A
的类,其中包含了一个名为 a_class_method
的类方法,在 M
模块中定义了一个名为 m_instance_method
的实例方法,在 B
类中引入了 M
模块,然后我们调用了 B.ancestors
方法得到了 B 类以及其祖先链中的所有方法,再调用 flat_map
和 sort
方法,将所有方法展平并按字母排序,最后调用 uniq
方法去重,即可得到 B 类和其祖先链中所有的方法。
上述三种方法都可以用来列出 Ruby 中的类方法,其中最常用的是 methods
方法,如果你想要列出某个对象的类方法,就可以使用 singleton_methods
方法,如果你需要查看某个类的全部方法,可以使用 ancestors
方法。