2015-02-23 54 views
4

我還以爲下面的代碼:混淆縮略地圖

val a = Array(1, 2, 3, 4, 5) 
println(a.map(n => "x")) 

可以簡寫爲:

val a = Array(1, 2, 3, 4, 5) 
println(a.map("x")) 

但後者給了我下面的異常。爲什麼是這樣?在在java.lang.String.charAt(String.java:658)1:

java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍: 1 java.lang.StringIndexOutOfBoundsException:字符串索引超出範圍 的 scala.collection.immutable.StringLike $ class.apply(StringLike.scala:52) 在 scala.collection.immutable.WrappedString.apply(WrappedString.scala:33) 在 scala.collection.immutable.WrappedString.apply (WrappedString.scala:33) at scala.collection.TraversableLike $$ anonfun $ map $ 1.apply(TraversableLike.scala:245) at scala.collection.TraversableLike $$ anonfun $ $地圖1.適用(TraversableLike.scala:245) 在 scala.collection.IndexedSeqOptimized $ class.foreach(IndexedSeqOptimized.scala:33) 在 scala.collection.mutable.ArrayOps $ ofInt.foreach(ArrayOps.scala:234) at scala.collection.TraversableLike $ class.map(TraversableLike.scala:245) at scala.collection.mutable.ArrayOps $ ofInt.map(ArrayOps.scala:234)

回答

7

Strings也是函數Int => Char它將給定索引處的字符提取到字符串中。因此

a.map("x") 

相當於

a.map(i => "x".charAt(i)) 

a第一個元素是1所以這將嘗試找到索引1處的炭字符串x其超出範圍,因此例外英寸

如果你想,它總是返回"x"的功能,那麼你可以使用Function.const

import Function.const 
a.map(const("x")) 
+0

或者你也可以做'a.map(_ =>「x」)'。這有點像是使用「身份」還是「x => x」之間的爭論。 – acjay 2015-02-23 13:41:27

3

斯卡拉String僅僅是java.lang.Strings一個佔位符類型。

String的所有實例都隱含地轉換爲scala.collection.immutable.StringOps,其擴展特徵StringLike[ String ],其繼而擴展特徵。

現在,特徵定義了一個抽象應用方法apply(index: Int): Char,它由特徵StringLike[ String ]實現。

因此,像val s = "A String"這樣的每個字符串實例都可以用作Int => Char類型的函數,就像這樣 - val c = s(0)

現在,您的a.map("x")相當於a.map(i => "x".apply(i))a.map("x".apply(_))a.map(i => ("x")(i))或簡單地a.map("x".apply)