加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

了解Scala中的字符串和map方法

发布时间:2020-12-16 18:06:19 所属栏目:安全 来源:网络整理
导读:我编写了以下简单示例来了解map方法的工作原理: object Main{ def main (args : Array[String]) = { val test = "abc" val t = Vector(97,98,99) println(test.map(c = (c + 1))) //1 Vector(98,99,100) println(test.map(c = (c + 1).toChar)) //2 bcd pri
我编写了以下简单示例来了解map方法的工作原理:

object Main{
  def main (args : Array[String]) = {
    val test = "abc"
    val t = Vector(97,98,99)
    println(test.map(c => (c + 1)))               //1 Vector(98,99,100)
    println(test.map(c => (c + 1).toChar))        //2 bcd
    println(t.map(i => (i + 1)))                  //3 Vector(98,100)
    println(t.map(i => (i + 1).toChar))           //4 Vector(b,c,d)
  };
}

我不太明白为什么在// 2打印bcd.由于Scala将每个String视为Seq,我认为test.map(c =>(c 1).toChar)应该生成另一个Seq.因为// 1表示Vector(b,d).但正如你所看到的,它没有.为什么?它是如何实际工作的?

解决方法

这是Scala集合的一个特性(在这种情况下,String被视为字符集合).真正的解释是相当复杂的,涉及对类型类的理解(我猜,这就是为什么在评论中提到了Haskell),但简单的解释是,并不是很难.

关键是,Scala集合库作者非常努力地避免代码重复.例如,String上的map函数实际上是在这里定义的:scala.collection.TraversableLike #map.另一方面,这种任务的天真方法会使地图返回TraversableLike,而不是调用地图的原始类型(它是String).这就是为什么他们想出了一种方法,可以避免代码重复和不必要的类型转换或太一般的返回类型.

基本上,像map这样的Scala集合方法产生的类型尽可能接近它所调用的类型.这是使用名为CanBuildFrom的类型类实现的.地图的完整签名如下:

def map[B,That](f: A => B)(implicit bf: CanBuildFrom[Repr,B,That]): That

什么是类型类和CanBuildFrom有很多解释.我建议先看这里:http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html#factoring-out-common-operations.另一个很好的解释是:Scala 2.8 CanBuildFrom

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读