2012-01-13 7 views
25

Cho bất kỳ đối tượng nào tôi có thể gọi #public_methods và xem tất cả các phương pháp mà nó sẽ phản hồi. Tuy nhiên, đôi khi tôi thấy có ích khi có danh sách nhanh tất cả các phương pháp công khai không được kế thừa, tức là những thứ thực sự là một phần của lớp học này.Làm cách nào để có được các phương pháp công khai của một lớp học mà không có các phương pháp kế thừa?

tôi tìm thấy trong "Easy way to list public methods for a Ruby object" rằng nếu tôi sử dụng:

(Foo.public_methods - Object.public_methods).sort 

tôi có thể lọc ra rất nhiều thứ của Ruby cơ bản. Tôi muốn có thể lọc tất cả mọi thứ được thừa kế tất cả các cách lên chuỗi. Nếu tôi biết lớp cha tôi có thể lọc bằng cách sử dụng nó, nhưng tôi muốn đưa ra một lệnh chung có thể trả về một mảng các phương thức công khai không được thừa kế cho bất kỳ đối tượng nào.

Trả lời

45

Chỉ cần vượt qua false cho inherited đối số của public_methods:

"hello".public_methods.include?(:dup) # => true 
"hello".public_methods(false).include?(:dup) # => false 

Không phải là câu trả lời cho câu hỏi của bạn, nhưng trong trường hợp bạn không biết, irb không autocompletion, vì vậy nó dễ dàng để có được danh sách của công chúng phương pháp (đặc biệt là nếu bạn biết bắt đầu của phương pháp bạn đang tìm kiếm). Chỉ cần nhấn tab; đánh nó hai lần sẽ liệt kê tất cả các khả năng (bao gồm cả những người thừa hưởng, mặc dù):

> "nice".d<tab><tab> 
"nice".delete  "nice".delete! "nice".display "nice".downcase     
"nice".downcase! "nice".dump  "nice".dup  "nice".define_singleton_method 

> "nice".<tab><tab> 
Display all 162 possibilities? (y or n) 
... 

Sử dụng pry làm cho nó thậm chí còn dễ dàng hơn để xem phương pháp có sẵn, chia theo mức độ thừa kế:

[1] pry(main)> cd "nice" 
[2] pry("nice"):1> ls 
Comparable#methods: < <= > >= between? 
String#methods: % * + << <=> == === =~ [] []= ascii_only? bytes bytesize byteslice capitalize capitalize! casecmp center chars chomp chomp! chop chop! chr clear codepoints concat count crypt delete delete! downcase downcase! dump each_byte each_char each_codepoint each_line empty? encode encode! encoding end_with? eql? force_encoding getbyte gsub gsub! hash hex include? index insert inspect intern length lines ljust lstrip lstrip! match next next! oct ord partition prepend replace reverse reverse! rindex rjust rpartition rstrip rstrip! scan setbyte shellescape shellsplit size slice slice! split squeeze squeeze! start_with? strip strip! sub sub! succ succ! sum swapcase swapcase! to_c to_f to_i to_r to_s to_str to_sym tr tr! tr_s tr_s! unpack upcase upcase! upto valid_encoding? 
locals: _ _dir_ _ex_ _file_ _in_ _out_ _pry_ 
+0

ý bạn là 'irb' hay' irc'? :-) –

+0

Thật vậy, 'irb'. Cảm ơn bạn và @Mu –

+0

Ah, siêu hữu ích! Tôi đã không nhận ra '# public_methods' chấp nhận bất kỳ đối số nào, và nó thậm chí không xảy ra với tôi để kiểm tra. Cảm ơn! – Andrew

5

Hãy nhìn vào Module#instance_methods

Bạn có thể sử dụng như sau:

class A 
    def method_1 
    puts "method from A" 
    end 
end 

class B < A 
    def method_2 
    puts "method from B" 
    end 
end 

B.instance_methods  # => [:method_1, :method_2, ...] 
B.instance_methods(false) # => [:method_2]