2016-09-09 63 views
0

在Python,我可以做這個如何觀察斯卡拉對象的可用成員

s = "Hello World" print(s.__dir__())

顯示一個對象的可用成員和它會吐出S有所有可用的成員。如何在scala中做到這一點?我谷歌和搜索文件,並沒有發現。

我之所以需要這個,是因爲我使用的IDE缺少製表符完成功能。因此,通過使用諸如__dir__()之類的東西來觀察可用性將是至關重要的。謝謝。

+0

你應該看看[公共領域](http://stackoverflow.com/q/7457972/508064) – roterl

+0

我試過你給的鏈接,沒有得到我的期望。我想要一個對象的所有屬性和方法,在這種情況下是字符串。 你能詳細說明爲什麼這個鏈接有幫助嗎? –

+1

你在使用什麼IDE,爲什麼你不能使用更好的IDE? (順便說一句,REPL已完成標籤) – jwvh

回答

0

在Scala中,這比在Python都困難得多,簡單得多。

要困難得多,因爲隱式轉換:例如,你可以叫上String->方法,即使沒有String超類或任何有->方法。但是,從Any的類型確實->方法(稱爲ArrowAssoc)的隱式轉換,所以它是合法的調用->方法上任何對象,因爲Scala將這個對象隱式轉換爲ArrayAssoc。這就是爲什麼你不能僅僅詢問一個對象關於它的可用方法的原因,因爲該對象不知道哪個隱式轉換可能在範圍內。

然而,它也容易得多,因爲可用選擇器的集合總是可以靜態確定的,而無需實際運行代碼。

Scala REPL使用Presentation Compiler實現完成,實現在類scala.tools.nsc.interpreter.resentationCompilerCompleter中。也許你可以在那裏找到一些靈感。通常,正確的方法是使用Scala反射和/或演示編譯器。

+0

謝謝!這個答案指向了我正確的方向。 –

0

您可以在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

+1

這會錯過像'+'和'##'這樣的方法,這些方法是通過隱式轉換爲'RichString',' - >'添加的,這是通過隱式轉換爲'ArrayAssoc'添加的,可能還有很多其他方法。 –