2016-05-12 37 views
2

我被這種表達猝不及防:語義startsWith對陣列

val words = strings.map(s => s.split(「,」)) // split CSV data 
val nonHashWords = words.filter(word => word.startsWith(「#」)) 

這種結構是錯誤的,因爲wordsSeq[Array[String]]代替intented Seq[String]。 我沒想到Array會有一個startsWith方法,所以我花了一些時間來理解它的語義。我自然希望這是真的:Array(「hello」, 「world」).startsWith(「hello」)

這裏是我的探索會話的其​​餘部分:

scala> val s = Array("hello","world") 
s: Array[String] = Array(hello, world) 

scala> s.startsWith("hello") 
res0: Boolean = false 

scala> s.startsWith("h") 
res1: Boolean = false 

scala> val s = Array("hello","hworld") 
s: Array[String] = Array(hello, hworld) 

scala> s.startsWith("h") 
res3: Boolean = false 

scala> s.startsWith("hworld") 
res4: Boolean = false 

scala> s.toString 
res5: String = [Ljava.lang.String;@11ed068 

scala> s.startsWith("[L") 
res6: Boolean = false 

scala> s.startsWith("[") 
res7: Boolean = false 

什麼是「array.startsWith」的預期行爲?

回答

4

以下文檔:

DEF startsWith [B](即:GenSeq [B]):Boolean測試此可變 索引序列是否與給定的序列開始。

所以array.startsWith(x)預計x是一個序列。

scala> val s = Array("hello","world") 
scala> s.startsWith(Seq("hello")) 
res8: Boolean = true 

在上面的問題中會發生什麼是作爲參數傳遞的字符串被評估爲一個字符序列。這導致沒有編譯器錯誤,雖然在這種情況下它不會產生預期的結果。

這應該說明:

scala> val hello = Array('h','e','l','l','o',' ','w','o','r','l','d') 
hello: Array[Char] = Array(h, e, l, l, o, , w, o, r, l, d) 

scala> hello.startsWith("hello") 
res9: Boolean = true 
+0

有趣的疑難雜症! –