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
,它扩展了trait
StringLike[String]
,而trait
又扩展了trait
IndexedSeqOptimized[Char,String]

现在,trait
IndexedSeqOptimized[Char,String]
定义了一个抽象的apply方法
apply(index:Int):Char
,它由trait
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”)

或者你也可以
a.map()=>“x”)
。这有点像是在使用
identity
还是
x=>x
之间的争论。