的公共方法?我的意思是,除了做陣列減法。我只想快速查看某個對象有時可用的內容,而無需轉到文檔。在沒有包含泛型對象的所有公共方法的情況下,Ruby中是否可以打印對象
2
A
回答
10
methods
,instance_methods
,public_methods
,private_methods
和protected_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
)所述的方法將不會出現在這裏。你唯一的選擇就是希望你正在使用的庫有充分的文檔記錄。
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
相關問題
- 1. 是否有任何泛型版本的Apache公共對象池?
- 2. 有沒有辦法在JavaScript中打印對象的所有方法?
- 3. Ruby - 如何在沒有.new的情況下創建MatchData對象?
- 4. 是否可以在沒有對象到對象映射的情況下強制執行外鍵?
- 5. 是否有可能解析JavaScript中的對象的所有公共變量?
- 6. 是否可以在沒有打印對話框的情況下打印Swing組件?
- 7. PHP:有沒有辦法打印所有已創建的對象?
- 8. 有沒有更好的方法來獲取Ruby對象的公共「屬性」?
- 9. 共享對象和包含沒有安裝在Linux下的C++
- 10. 是否有一個DatabaseManager包含所有模型對象的所有功能?
- 11. 是否可以共享相同的對象到所有請求?
- 12. 只有在可以正確創建對象的情況下才返回對象
- 13. 打印類中的所有對象
- 14. RESTful網址是否在對象之間沒有ID的情況下有效?
- 15. 在什麼情況下SqlCommand對象的prepare方法有用?
- 16. 有沒有辦法在不知道對象的結構的情況下從JSON組成匿名類型對象?
- 17. java jackson解析包含泛型類型對象的對象
- 18. 有沒有簡單的方法來判斷json對象是否包含屬性?
- 19. 在沒有NSPredicate的情況下過濾NSMutableArray中的NSNumber對象?
- 20. 我是否可以在沒有Vue Loader的情況下包含scoped css?
- 21. 包含的是對象沒有方法嗎?
- 22. 如何在WPF中沒有打印對話框的情況下直接打印?
- 23. 是否有可能在沒有請求對象的情況下在Django中使用上下文處理器?
- 24. 檢查對象是否包含數組中的所有鍵
- 25. 是否可以在不影響第一個對象的情況下將@Entity對象轉換爲普通對象?
- 26. 對象[對象對象]沒有方法'腳下'
- 27. 有沒有辦法可以打印出數組中的多個對象?
- 28. 在Ruby中,過濾包含單詞「time」的對象的所有方法的好方法是什麼?
- 29. 簡單的方法來檢查對象是否可打印
- 30. 沒有泛型支持的嵌套對象:解決方法
也許你應該你的榜樣更改爲類似'」而不是「.public_methods」或「[] .public_methods」。任何知道Ruby的人都會明白,你的例子列舉了'Array'類對象*本身*響應的方法,而不是'Array'類的實例方法,但它可能會誤導新手。 –
@JörgWMittag感謝您的意見。我去了一個自定義類,因爲數組或字符串實例有太多的方法,並且SO代碼塊不包裝行。目前尚不清楚結果是不一樣的。 –