programing

루비에서 객체에 대한 모든 메소드를 나열하는 방법은 무엇입니까?

css3 2023. 6. 4. 22:30

루비에서 객체에 대한 모든 메소드를 나열하는 방법은 무엇입니까?

특정 개체가 액세스할 수 있는 모든 메서드를 나열하려면 어떻게 해야 합니까?

나는 있습니다@current_user애플리케이션 컨트롤러에 정의된 개체:

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

또한 보기 파일에서 사용할 수 있는 방법이 무엇인지 알고 싶습니다.구체적으로 어떤 방법이:has_many협회가 제공합니다.(알고 있습니다.:has_many 제공해야 하지만 확인하고 싶습니다.)

다음은 기본 개체 클래스에 없는 사용자 클래스의 메서드를 나열합니다.

>> 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클래스 및 클래스 인스턴스에 대한 메서드입니다.

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.

(많은) has_methods_의 결과로 생성된 메서드는 User 클래스에 정의된 많은 관계의 결과에 없습니다.methods불러.

추가됨:has_many는 메서드를 직접 추가하지 않습니다.대신 ActiveRecord 기계는 Ruby를 사용합니다.method_missing그리고.responds_to메서드 호출을 즉시 처리하는 기술.결과적으로 방법은 에 나열되지 않습니다.methods방법 결과

아니면 그냥User.methods(false)해당 클래스에 정의된 메서드만 반환합니다.

모듈 #instance_methods

수신기에서 공용 인스턴스 메서드 및 보호된 인스턴스 메서드의 이름이 들어 있는 배열을 반환합니다.모듈의 경우 이들은 공개 메서드 및 보호 메서드이고 클래스의 경우 인스턴스(싱글턴이 아님) 메서드입니다.인수가 없거나 잘못된 인수를 지정하면 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

인스턴스(@current_user의 경우)로 응답하는 메서드 목록을 찾고 있는 경우.루비 문서화 방법에 따라

공용 메서드와 보호된 메서드의 이름 목록을 반환합니다.여기에는 obj의 조상들이 접근할 수 있는 모든 방법이 포함됩니다.옵션 매개 변수가 false이면 obj의 공용 및 보호된 싱글톤 메서드 배열을 반환합니다. 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.

사용자가_많은 게시물을 가지고 있다고 가정:

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

@clyfe의 대답을 자세히 설명합니다.다음 코드를 사용하여 인스턴스 메서드의 목록을 가져올 수 있습니다("Parser"라는 이름의 개체 클래스가 있다고 가정).

Parser.new.methods - Object.new.methods

언급URL : https://stackoverflow.com/questions/8595184/how-to-list-all-methods-for-an-object-in-ruby