在Python,我可以做這個如何觀察斯卡拉對象的可用成員
s = "Hello World" print(s.__dir__())
顯示一個對象的可用成員和它會吐出S有所有可用的成員。如何在scala中做到這一點?我谷歌和搜索文件,並沒有發現。
我之所以需要這個,是因爲我使用的IDE缺少製表符完成功能。因此,通過使用諸如__dir__()
之類的東西來觀察可用性將是至關重要的。謝謝。
在Python,我可以做這個如何觀察斯卡拉對象的可用成員
s = "Hello World" print(s.__dir__())
顯示一個對象的可用成員和它會吐出S有所有可用的成員。如何在scala中做到這一點?我谷歌和搜索文件,並沒有發現。
我之所以需要這個,是因爲我使用的IDE缺少製表符完成功能。因此,通過使用諸如__dir__()
之類的東西來觀察可用性將是至關重要的。謝謝。
在Scala中,這比在Python都困難得多,簡單得多。
要困難得多,因爲隱式轉換:例如,你可以叫上String
的->
方法,即使沒有String
超類或任何有->
方法。但是,從Any
的類型確實有->
方法(稱爲ArrowAssoc
)的隱式轉換,所以它是合法的調用->
方法上任何對象,因爲Scala將這個對象隱式轉換爲ArrayAssoc
。這就是爲什麼你不能僅僅詢問一個對象關於它的可用方法的原因,因爲該對象不知道哪個隱式轉換可能在範圍內。
然而,它也容易得多,因爲可用選擇器的集合總是可以靜態確定的,而無需實際運行代碼。
Scala REPL使用Presentation Compiler實現完成,實現在類scala.tools.nsc.interpreter.resentationCompilerCompleter
中。也許你可以在那裏找到一些靈感。通常,正確的方法是使用Scala反射和/或演示編譯器。
謝謝!這個答案指向了我正確的方向。 –
您可以在Class
實例上使用java反射。
E.g.拿到領域
s.getClass.getDeclaredFields
這將讓你一個數組,你可以賺更多的可讀性,像這樣
scala> s.getClass.getDeclaredFields.mkString("\n")
res3: String =
private final char[] java.lang.String.value
private int java.lang.String.hash
private static final long java.lang.String.serialVersionUID
private static final java.io.ObjectStreamField[] java.lang.String.serialPersistentFields
public static final java.util.Comparator java.lang.String.CASE_INSENSITIVE_ORDER
的Class
暴露出類似的方法來instrospect你的對象。
你可以參考the docs
這會錯過像'+'和'##'這樣的方法,這些方法是通過隱式轉換爲'RichString',' - >'添加的,這是通過隱式轉換爲'ArrayAssoc'添加的,可能還有很多其他方法。 –
你應該看看[公共領域](http://stackoverflow.com/q/7457972/508064) – roterl
我試過你給的鏈接,沒有得到我的期望。我想要一個對象的所有屬性和方法,在這種情況下是字符串。 你能詳細說明爲什麼這個鏈接有幫助嗎? –
你在使用什麼IDE,爲什麼你不能使用更好的IDE? (順便說一句,REPL已完成標籤) – jwvh