简体   繁体   English

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

[英]How to list all methods for an object in Ruby?

How do I list all the methods that a particular object has access to? 如何列出特定对象可以访问的所有方法?

I have a @current_user object, defined in the application controller: 我有一个@current_user对象,在应用程序控制器中定义:

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

And want to see what methods I have available to me in the view file. 并希望在视图文件中查看我可以使用的方法。 Specifically, I want to see what methods a :has_many association provides. 具体来说,我想看看a :has_many关联提供了哪些方法。 (I know what :has_many should provide, but want to check that.) (我知道:has_many 应该提供什么,但想检查一下。)

The following will list the methods that the User class has that the base Object class does not have... 以下将列出User类具有基础Object类没有的方法...

>> 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", ...

Note that methods is a method for Classes and for Class instances. 请注意, methods是类和类实例的方法。

Here's the methods that my User class has that are not in the ActiveRecord base class: 这是我的User类具有的不在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.

Note that the methods created as a result of the (many) has_many relationships defined in the User class are not in the results of the methods call. 请注意,由于User类中定义的(许多)has_many关系而创建的方法不在 methods调用的结果中。

Added Note that :has_many does not add methods directly. 添加注意:has_many不直接添加方法。 Instead, the ActiveRecord machinery uses the Ruby method_missing and responds_to techniques to handle method calls on the fly. 相反,ActiveRecord机制使用Ruby method_missingresponds_to技术来动态处理方法调用。 As a result, the methods are not listed in the methods method result. 因此, methods方法结果中未列出方法。

Module#instance_methods 模块#instance_methods

Returns an array containing the names of the public and protected instance methods in the receiver. 返回一个数组,其中包含接收器中公共和受保护实例方法的名称。 For a module, these are the public and protected methods; 对于模块,这些是公共和受保护的方法; for a class, they are the instance (not singleton) methods. 对于一个类,它们是实例(而不是单例)方法。 With no argument, or with an argument that is false, the instance methods in mod are returned, otherwise the methods in mod and mod's superclasses are returned. 如果没有参数,或者参数为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

或者只是User.methods(false)只返回该类中定义的方法。

You can do 你可以做

current_user.methods

For better listing 为了更好的上市

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

What about one of these? 其中一个怎么样?

object.methods.sort
Class.methods.sort

To expound upon @clyfe's answer. 阐述@ clyfe的答案。 You can get a list of your instance methods using the following code (assuming that you have an Object Class named "Parser"): 您可以使用以下代码获取实例方法的列表(假设您有一个名为“Parser”的对象类):

Parser.new.methods - Object.new.methods

If You are looking list of methods which respond by an instance (in your case @current_user). 如果您正在查看按实例响应的方法列表(在您的情况下为@current_user)。 According to ruby documentation methods 根据ruby文档方法

Returns a list of the names of public and protected methods of obj. 返回obj的public方法和受保护方法的名称列表。 This will include all the methods accessible in obj's ancestors. 这将包括obj的祖先可访问的所有方法。 If the optional parameter is false, it returns an array of obj's public and protected singleton methods, the array will not include methods in modules included in obj. 如果可选参数为false,则返回obj的public和protected singleton方法的数组,该数组将不包含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.

Alternatively, You can also check that a method is callable on an object or not?. 或者,您还可以检查方法是否可以在对象上调用?

@current_user.respond_to?:your_method_name

If you don't want parent class methods then just subtract the parent class methods from it. 如果您不想要父类方法,那么只需从中减去父类方法。

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

Suppose User has_many Posts: 假设用户has_many帖子:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM