gpt4 book ai didi

string - Scala:如何找出用于 StringOps.map 的 CanBuildFrom 实现

转载 作者:行者123 更新时间:2023-12-01 09:22:43 24 4
gpt4 key购买 nike

我正在通过练习“不耐烦的 Scala”一书中的练习来学习 Scala。一个问题问:

The result of "abc".map(_.toUpper) is a String, but the result of "abc".map(_.toInt) is a Vector. Find out why.

阅读“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)

所以 Predef.StringCanBuildFrom 类型为 CanBuildFrom[String,Char,String] 用于 _.toUpperPredef。 CanBuildFrom[String,Int,IndexedSeq[Int]] 类型的 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 是具体实现。

关于string - Scala:如何找出用于 StringOps.map 的 CanBuildFrom 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30703752/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com