我会想到以下代码:
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:字符串索引超出范围:在scala.collection.immutable.StringLike的java.lang.String.charAt(String.java:658)处为1 $ class.apply(StringLike.scala:52)at scala.collection.immutable.WrappedString.apply(WrappedString.scala:33)at scala.collection.immutable.WrappedString.apply(WrappedString.scala:33)at scala.collection . TraversableLike $$ anonfun $ map $ 1.apply(TraversableLike.scala:245)at scala.collection.TraversableLike $$ anonfun $ map $ 1.apply(TraversableLike.scala:245)at scala.collection.IndexedSeqOptimized $ class.foreach(IndexedSeqOptimized . 斯卡拉:33)在scala.collection.mutable.ArrayOps $ ofInt.foreach(ArrayOps.scala:234)在scala.collection.TraversableLike $ class.map(TraversableLike.scala:245)在scala.collection.mutable.ArrayOps $ ofInt .MAP(ArrayOps.scala:234)
2 回答
在scala中
String
只是java.lang.Strings
的占位符类型 .String
的所有实例都隐式转换为scala.collection.immutable.StringOps
,扩展了特征StringLike[ String ]
,后者又扩展了特征IndexedSeqOptimized[Char, String]
.现在,trait
IndexedSeqOptimized[Char, String]
定义了一个抽象的应用方法apply(index: Int): Char
,它由traitStringLike[ String ]
实现 .因此,像
val s = "A String"
这样的每个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 )
.Strings
也是函数Int => Char
,它将给定索引处的char提取到字符串中 . 因此相当于
a
的第一个元素是1
所以这将尝试在字符串x
中的索引1处查找超出范围的char,因此是异常 .如果你想要一个总是返回
"x"
的函数,那么你可以使用Function.const
: