2011-11-15 44 views

回答

10

methodsinstance_methodspublic_methodsprivate_methodsprotected_methods都接受一個布爾參數以確定是否包含你的對象的父母的方法。

例如:

ruby-1.9.2-p0 > class MyClass < Object; def my_method; return true; end; end; 
ruby-1.9.2-p0 > MyClass.new.public_methods 
=> [:my_method, :nil?, :===, :=~, :!~, :eql?, :hash, :<=>, :class, :singleton_class, :clone, :dup, :initialize_dup, :initialize_clone, :taint, :tainted?, :untaint, :untrust, :untrusted?, :trust, :freeze, :frozen?, :to_s, :inspect, :methods, :singleton_methods, :protected_methods, :private_methods, :public_methods, :instance_variables, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :instance_of?, :kind_of?, :is_a?, :tap, :send, :public_send, :respond_to?, :respond_to_missing?, :extend, :display, :method, :public_method, :define_singleton_method, :__id__, :object_id, :to_enum, :enum_for, :==, :equal?, :!, :!=, :instance_eval, :instance_exec, :__send__] 
ruby-1.9.2-p0 > MyClass.new.public_methods(false) 
=> [:my_method] 

正如@Marnen指出,動態定義(例如用method_missing)所述的方法將不會出現在這裏。你唯一的選擇就是希望你正在使用的庫有充分的文檔記錄。

+2

也許你應該你的榜樣更改爲類似'」而不是「.public_methods」或「[] .public_methods」。任何知道Ruby的人都會明白,你的例子列舉了'Array'類對象*本身*響應的方法,而不是'Array'類的實例方法,但它可能會誤導新手。 –

+0

@JörgWMittag感謝您的意見。我去了一個自定義類,因爲數組或字符串實例有太多的方法,並且SO代碼塊不包裝行。目前尚不清楚結果是不一樣的。 –

0

如果有,它不會非常有用:由於Ruby有能力通過動態元編程僞造方法,所以公共方法通常不是唯一的選擇。所以你不能真正依靠instance_methods來告訴你很多有用的信息。

1

這是你要找的結果嗎?

class Foo 
    def bar 
    p "bar" 
    end 
end 

p Foo.public_instance_methods(false) # => [:bar] 


PS我希望這不是你的結果後:

p Foo.public_methods(false)   # => [:allocate, :new, :superclass] 
0

我開始嘗試在一個點所有這些檢查方法記錄在https://github.com/bf4/Notes/blob/master/code/ruby_inspection.rb

正如指出的其他答案:

class Foo; def bar; end; def self.baz; end; end 

首先,我喜歡的方法

Foo.public_methods.sort # all public instance methods 
Foo.public_methods(false).sort # public class methods defined in the class 
Foo.new.public_methods.sort # all public instance methods 
Foo.new.public_methods(false).sort # public instance methods defined in the class 

有用的提示grep的梳理,找出你的選擇是

Foo.public_methods.sort.grep /methods/ # all public class methods matching /method/ 
# ["instance_methods", "methods", "private_instance_methods", "private_methods", "protected_instance_methods", "protected_methods", "public_instance_methods", "public_methods", "singleton_methods"] 
Foo.new.public_methods.sort.grep /methods/ 
# ["methods", "private_methods", "protected_methods", "public_methods", "singleton_methods"] 

另見https://stackoverflow.com/questions/123494/whats-your-favourite-irb-trick

相關問題