Scala 简写地图的困惑
我会想到以下代码:Scala 简写地图的困惑,scala,Scala,我会想到以下代码: 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.StringIndexOutOfBoundsException:字符串索引超出范围: 1 java.lang.StringIndexOutOfBoundsException:字符串索引超出 范
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.StringIndexOutOfBoundsException:字符串索引超出范围:
1 java.lang.StringIndexOutOfBoundsException:字符串索引超出
范围:1在java.lang.String.charAt(String.java:658)在
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)
在
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
在
scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
在
scala.collection.IndexedSeqOptimized$class.foreach(IndexedSeqOptimized.scala:33)
在
scala.collection.mutable.ArrayOps$ofit.foreach(ArrayOps.scala:234)
在
scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
位于scala.collection.mutable.ArrayOps$ofInt.map(ArrayOps.scala:234)
Strings
也是函数Int=>Char
,它将给定索引处的字符提取到字符串中。所以
a.map("x")
相当于
a.map(i => "x".charAt(i))
a
的第一个元素是1
,因此这将尝试查找字符串x
中索引1处超出范围的字符,因此出现异常
如果希望函数始终返回“x”
,则可以使用function.const
:
import Function.const
a.map(const("x"))
在scala中,
String
只是java.lang.Strings
的占位符类型
String
的所有实例都隐式转换为scala.collection.immutable.StringOps
,它扩展了traitStringLike[String]
,而trait又扩展了traitIndexedSeqOptimized[Char,String]
现在,traitIndexedSeqOptimized[Char,String]
定义了一个抽象的apply方法apply(index:Int):Char
,它由traitStringLike[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”)或者你也可以a.map()=>“x”)
。这有点像是在使用identity
还是x=>x
之间的争论。