Scala:如何找出StringOps.map使用了哪个CanBuildFrom实现



我正在通过《Scala for the patience》这本书中的练习来学习Scala。一个问题问:

"abc".map(_.toUpper)的结果是一个String,但是"abc".map(_.toInt)Vector。找出原因。

看完"The Architecture of Scala Collections",我认为这是因为选择了不同的CanBuildFrom隐式实现。我怎样才能知道上面的表达式选择了哪些?

您可以使用show{reify{...}}获得所有隐式如下:

scala> import scala.reflect.runtime.{universe => ru}
import scala.reflect.runtime.{universe=>ru}
scala> ru.show{ ru.reify{ "abc".map(_.toUpper) }.tree }
res0: String = Predef.augmentString("abc").map(((x$1) => Predef.charWrapper(x$1).toUpper))(Predef.StringCanBuildFrom)
scala> ru.show{ ru.reify{ "123".map(_.toInt) }.tree }
res1: String = Predef.augmentString("123").map(((x$1) => x$1.toInt))(Predef.fallbackStringCanBuildFrom)

因此,CanBuildFrom[String,Char,String]类型的Predef.StringCanBuildFrom用于_.toUpper, CanBuildFrom[String,Int,IndexedSeq[Int]]类型的Predef.fallbackStringCanBuildFrom用于_.toInt

scala> Predef.StringCanBuildFrom
res2: scala.collection.generic.CanBuildFrom[String,Char,String] = scala.Predef$$anon$3@43b7a6fa
scala> Predef.fallbackStringCanBuildFrom[Int]
res3: scala.collection.generic.CanBuildFrom[String,Int,scala.collection.immutable.IndexedSeq[Int]] = scala.LowPriorityImplicits$$anon$4@61af1aa0

注意类型不是Vector,而是IndexedSeqVector是具体实现

相关内容

  • 没有找到相关文章

最新更新