ฉันมีคลาส:
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)
Object#methods
ผลตอบแทนที่ได้วิธีการที่คุณสามารถเรียกบนวัตถุ วิธีใดที่คุณสามารถเรียกใช้กับวัตถุได้? คนที่กำหนดไว้ในของชั้น ซึ่งหมายความว่าTestClass.methods
จะส่งคืนรายการของวิธีการที่คุณสามารถเรียกใช้TestClass
ซึ่งเป็นวิธีการที่กำหนดไว้ในคลาสของมัน อะไรคือสิ่งที่TestClass
ระดับ 's? มันคือClass
. ดังนั้นTestClass.methods
จะช่วยให้คุณวิธีการที่กำหนดไว้ในไม่คนที่มีการกำหนดไว้ในClass
TestClass
ไม่แน่ใจว่าคำตอบนี้ได้รับการโหวตถึง 116 ครั้งเมื่อมีใครแม้แต่
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
คุณจะได้รับรายละเอียดมากขึ้น (เช่นโครงสร้างด้วยการกำหนดระดับ) กับอัญมณีเช่นการแก้จุดบกพร่องหรือlooksee
อ้างอิงจาก Ruby Doc instance_methods
ส่งคืนอาร์เรย์ที่มีชื่อของวิธีการสาธารณะและอินสแตนซ์ที่ได้รับการป้องกันในเครื่องรับ สำหรับโมดูลเหล่านี้เป็นวิธีสาธารณะและได้รับการป้องกัน สำหรับคลาสเป็นวิธีการอินสแตนซ์ (ไม่ใช่ซิงเกิลตัน) หากพารามิเตอร์ทางเลือกเป็นเท็จจะไม่มีการรวมเมธอดของบรรพบุรุษ ฉันกำลังดูตัวอย่างเอกสารอย่างเป็นทางการ
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)