수업이 있습니다.
class TestClass
def method1
end
def method2
end
def method3
end
end
어떻게 (이 클래스 내 방법의 목록을 얻을 수 있습니다 method1
, method2
, method3
)?
수업이 있습니다.
class TestClass
def method1
end
def method2
end
def method3
end
end
어떻게 (이 클래스 내 방법의 목록을 얻을 수 있습니다 method1
, method2
, method3
)?
답변:
그 자체로 할 수 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"]
print TestClass.new.instance_methods
때이 오류가 발생합니다my_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
TestClass.new.methods
. 내 대답에서 "그것"이 모호했을 수도 있습니다.
[:method1]
대신 얻을 수 있습니다.
TestClass.methods(false)
해당 클래스에만 속하는 메서드 만 가져옵니다.
TestClass.instance_methods(false)
주어진 예제에서 메서드를 반환합니다 (TestClass의 인스턴스 메서드이기 때문에).
TestClass.instance_methods
또는 상속 된 모든 메서드없이
TestClass.instance_methods - Object.methods
( 'TestClass.methods-Object.methods'였습니다.)
TestClass.methods(false)
.
TestClass.methods(false)
빈 반환
method1
, method2
또는 method3
그이 방법이기 때문에, 인스턴스 클래스는 아닌 방법 TestClass
객체 자체가.
$ 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
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]
자체 메서드 만 가져오고 상속 된 메서드를 제외하려면 :
인스턴스 내에서 :
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 포함)