클래스의 인스턴스 메서드 목록 가져 오기


98

수업이 있습니다.

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

어떻게 (이 클래스 내 방법의 목록을 얻을 수 있습니다 method1, method2, method3)?

답변:


114

그 자체로 할 수 TestClass.instance_methods있는 일에 관심이 없다면 실제로를 원합니다 TestClass.

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

TestClass.methods.grep(/method1/) # => []
TestClass.instance_methods.grep(/method1/) # => ["method1"]
TestClass.methods.grep(/new/) # => ["new"]

또는 객체에 대해 호출 할 수 있습니다 methods(아님 instance_methods).

test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]

3
헤, 당신은 47 초로 나를 이겼습니다. +1
Phrogz 2011 년

2
시도 할 print TestClass.new.instance_methods때이 오류가 발생합니다my_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
Vladimir Tsukanov 2011-06-24

당신은 TestClass.new.methods. 내 대답에서 "그것"이 모호했을 수도 있습니다.
Andrew Grimm

Ruby 1.9 이상에서 메서드 이름 배열은 문자열이 아니라 기호입니다.
Phrogz 2011-06-24

1
@Phrogz : 예,하지만 정규 표현식을 사용할 수 있습니다. 크 툴루를 소환하지도 않습니다! :) [:method1]대신 얻을 수 있습니다.
Andrew Grimm

113
TestClass.methods(false) 

해당 클래스에만 속하는 메서드 만 가져옵니다.

TestClass.instance_methods(false) 주어진 예제에서 메서드를 반환합니다 (TestClass의 인스턴스 메서드이기 때문에).


2
이것은 메서드를 직접 시도하고 호출 할 필요없이 클래스에 의사 인터페이스 / 추상 기본 클래스의 다형성 메서드가 있는지 테스트하는 좋은 방법입니다.
Daniel Doezema 2013

2
받아 들여진 대답은 훌륭하지만 이것은 더 많은 사람들이 여기에 올 것입니다!
Aaron

이것은 확실히 받아 들여진 대답이어야합니다. 감사!
Vinicius Brasil

38
TestClass.instance_methods

또는 상속 된 모든 메서드없이

TestClass.instance_methods - Object.methods

( 'TestClass.methods-Object.methods'였습니다.)


25
또는 상속 된 메서드없이 : TestClass.methods(false).
사와

2
@sawa는 TestClass.methods(false)빈 반환
블라디미르 Tsukanov에게

1
이 대답은 틀 렸습니다. 결과는 포함되지 않습니다 method1, method2또는 method3그이 방법이기 때문에, 인스턴스 클래스는 아닌 방법 TestClass객체 자체가.
Phrogz 2011-06-24

1
@Phrogz : 죄송합니다 ... 예, 'TestClass.instance_methods-Object.methods'또는 'TestClass.new.methods-Object.methods'... 콘솔을 실행하지 않는 방법을 알려줍니다. 이 답변을 삭제하거나 편집하는 것이 가장 좋습니까?
Pavling 2011-06-24

1
@Pavling 정답을 확실히 수정하십시오. (빨리는 영업 이익 전에 다른 사람에게 신용을 할당합니다 :)!
Phrogz

6

디버깅 이나 looksee 같은 gem을 사용하여 더 자세한 목록 (예 : 클래스를 정의하여 구조화 됨)을 얻을 수 있습니다 .


6
$ irb --simple-prompt

class TestClass
  def method1
  end

  def method2
  end

  def method3
  end
end

tc_list = TestClass.instance_methods(false)
#[:method1, :method2, :method3]
puts tc_list
#method1
#method2
#method3

2
이것은 다른 답변과 너무 유사하며 추가 정보 나 명확성을 추가하지 않습니다.
실질적인

3
당신은 또한 매우 늦었습니다. : D
더글라스 G. 앨런

2

Ruby Doc instance_methods 에 따르면

수신자의 공용 및 보호 된 인스턴스 메서드의 이름을 포함하는 배열을 반환합니다. 모듈의 경우 이는 공용 및 보호 된 메소드입니다. 클래스의 경우 인스턴스 (단일 항목이 아님) 메서드입니다. 선택적 매개 변수가 false이면 조상의 메소드가 포함되지 않습니다. 공식 문서 예제를 사용하고 있습니다.

module A
  def method1()  
    puts "method1 say hi"
  end
end
class B
  include A #mixin
  def method2()  
     puts "method2 say hi"
  end
end
class C < B #inheritance
  def method3() 
     puts "method3 say hi"
  end
end

출력을 봅시다.

A.instance_methods(false)
  => [:method1]

A.instance_methods
  => [:method1]
B.instance_methods
 => [:method2, :method1, :nil?, :===, ...# ] # methods inherited from parent class, most important :method1 is also visible because we mix module A in class B

B.instance_methods(false)
  => [:method2]
C.instance_methods
  => [:method3, :method2, :method1, :nil?, :===, ...#] # same as above
C.instance_methods(false)
 => [:method3]

0

자체 메서드 만 가져오고 상속 된 메서드를 제외하려면 :

인스턴스 내에서 :

self.methods - self.class.superclass.instance_methods

밖에서:

TestClass.instance_methods - TestClass.superclass.instance_methods

수업에 추가하십시오.

class TestClass
  class << self
    def own_methods
      self.instance_methods - self.superclass.instance_methods
    end
  end
end

TestClass.own_methods
=> [:method1, :method2, method3]

(루비 2.6.x 포함)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.