如何在Ruby中列出一个对象的所有方法?

如何列出特定对象有权访问的所有方法?

我有一个@current_user对象,在应用程序控制器中定义:

 def current_user @current_user ||= User.find(session[:user_id]) if session[:user_id] end 

并想查看我在视图文件中提供给我的方法。 具体来说,我想看看:has_many关联提供了什么方法。 (我知道:has_many 应该提供,但要检查。)

下面将列出User类具有的基类对象类没有的方法…

 >> User.methods - Object.methods => ["field_types", "maximum", "create!", "active_connections", "to_dropdown", "content_columns", "su_pw?", "default_timezone", "encode_quoted_value", "reloadable?", "update", "reset_sequence_name", "default_timezone=", "validate_find_options", "find_on_conditions_without_deprecation", "validates_size_of", "execute_simple_calculation", "attr_protected", "reflections", "table_name_prefix", ... 

请注意, methods是Classes和Class实例的一种方法。

下面是我的用户类不在ActiveRecord基类中的方法:

 >> User.methods - ActiveRecord::Base.methods => ["field_types", "su_pw?", "set_login_attr", "create_user_and_conf_user", "original_table_name", "field_type", "authenticate", "set_default_order", "id_name?", "id_name_column", "original_locking_column", "default_order", "subclass_associations", ... # I ran the statements in the console. 

请注意,作为User类中定义的(many)has_many关系创build的方法不在 methods调用的结果中。

补充说明:has_many不直接添加方法。 相反,ActiveRecord机制使用Ruby method_missingresponds_to技术来即时处理方法调用。 因此,这些方法未在methods方法结果中列出。

模块#instance_methods

返回一个数组,其中包含接收者中公有和受保护实例方法的名称。 对于一个模块,这些是公共和受保护的方法; 对于一个类,它们是实例(而不是单例)方法。 如果没有参数,或者参数为false,则返回mod中的实例方法,否则返回mod和mod超类中的方法。

 module A def method1() end end class B def method2() end end class C < B def method3() end end A.instance_methods #=> [:method1] B.instance_methods(false) #=> [:method2] C.instance_methods(false) #=> [:method3] C.instance_methods(true).length #=> 43 

你可以做

 current_user.methods 

为了更好的上市

 puts "\n\current_user.methods : "+ current_user.methods.sort.join("\n").to_s+"\n\n" 

那其中的一个呢?

 object.methods.sort Class.methods.sort 

假设用户has_many文章:

 u = User.first u.posts.methods u.posts.methods - Object.methods 

阐述@ clyfe的答案。 您可以使用以下代码获取实例方法的列表(假设您有一个名为“Parser”的对象类):

 Parser.new.methods - Object.new.methods 

如果您正在查看由实例响应的方法列表(在您的情况下@current_user)。 根据ruby文档的方法

返回obj的public和protected方法的名称列表。 这将包括在obj的祖先中可以访问的所有方法。 如果可选参数为false,则返回一个obj的public和protected单例方法数组,该数组不包含obj中包含的模块中的方法。

 @current_user.methods @current_user.methods(false) #only public and protected singleton methods and also array will not include methods in modules included in @current_user class or parent of it. 

另外,你也可以检查一个方法是否可以在对象上调用?

 @current_user.respond_to?:your_method_name 

如果你不想要父类方法,那么就从它中减去父类方法。

 @current_user.methods - @current_user.class.superclass.new.methods #methods that are available to @current_user instance.