Tôi có một lớp học:
class TestClass
def method1
end
def method2
end
def method3
end
end
Làm thế nào tôi có thể nhận được một danh sách các phương pháp của tôi trong lớp này ( method1
, method2
, method3
)?
Tôi có một lớp học:
class TestClass
def method1
end
def method2
end
def method3
end
end
Làm thế nào tôi có thể nhận được một danh sách các phương pháp của tôi trong lớp này ( method1
, method2
, method3
)?
Câu trả lời:
Bạn thực sự muốn TestClass.instance_methods
, trừ khi bạn quan tâm đến những gì TestClass
nó có thể làm.
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"]
Hoặc bạn có thể gọi methods
(không instance_methods
) trên đối tượng:
test_object = TestClass.new
test_object.methods.grep(/method1/) # => ["method1"]
print TestClass.new.instance_methods
, tôi nhận được lỗi nàymy_class.rb:10:in <main>: undefined method instance_methods for #<TestClass:0x96b9d20> (NoMethodError)
TestClass.new.methods
. Có lẽ "nó" đã mơ hồ trong câu trả lời của tôi.
[:method1]
thay thế.
TestClass.methods(false)
để chỉ nhận các phương thức chỉ thuộc về lớp đó.
TestClass.instance_methods(false)
sẽ trả về các phương thức từ ví dụ đã cho của bạn (vì chúng là các phương thức thể hiện của TestClass).
TestClass.instance_methods
hoặc không có tất cả các phương pháp kế thừa
TestClass.instance_methods - Object.methods
(Là 'TestClass.methods - Object.methods')
TestClass.methods(false)
.
TestClass.methods(false)
trả về trống
method1
, method2
hoặc method3
, vì đó là các phương thức của các thể hiện của lớp, không phải phương thức của TestClass
chính đối tượng.
$ 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
Theo Ruby Doc instance_methods
Trả về một mảng chứa tên của các phương thức cá thể công khai và được bảo vệ trong bộ thu. Đối với một mô-đun, đây là các phương thức công khai và được bảo vệ; đối với một lớp, chúng là các phương thức instance (không phải singleton). Nếu tham số tùy chọn là false, các phương thức của bất kỳ tổ tiên nào sẽ không được đưa vào. Tôi đang lấy ví dụ tài liệu chính thức.
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
Hãy xem đầu ra.
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]
Để chỉ nhận các phương thức của riêng mình và loại trừ các phương thức kế thừa:
Từ trong ví dụ:
self.methods - self.class.superclass.instance_methods
Từ bên ngoài:
TestClass.instance_methods - TestClass.superclass.instance_methods
Thêm nó vào lớp:
class TestClass
class << self
def own_methods
self.instance_methods - self.superclass.instance_methods
end
end
end
TestClass.own_methods
=> [:method1, :method2, method3]
(với ruby 2,6.x)