地图数据类型创建

时间:2018-10-28 13:45:25

标签: scala

此表达式有什么作用?

^(?=[0-9a-f,]+$)[^,](?:[^,]{2})*(?:,[^,](?:[^,]{2})*)*$

这是返回值:

val m = Map(1 -> 2, 2 -> 4)

2 个答案:

答案 0 :(得分:1)

a -> b是用于创建元组(a, b)的语法糖。

scala Map构造函数将任意数量的元组(a, b)作为参数,并从每个元组的第一个元素到第二个元素创建一个mapping。在您的情况下,由于您是用整数填充的,所以它会生成Map[Int, Int]:从整数到整数的映射。

您现在可以使用地图,例如如下:

m(1)  // Has value 2
m(2)  // Has value 4

答案 1 :(得分:1)

  

此表达式有什么作用?

注意:这不是表达式,而是value definitionval定义没有值。

不过,=之后的部分是一个表达式。

val m = Map(1 -> 2, 2 -> 4)

在Scala中,foo(bar)可能是以下两件事之一:

所以foo(bar)等同于

this.foo(bar)

foo.apply(bar)

取决于当前范围中可用的对象。

在这种情况下,当前范围内没有定义名为Map的方法,它对应于第二个含义:

Map.apply(1 -> 2, 2 -> 4)

Map来自哪里?这实际上是scala.Predef.Map,它是在scala.Predef中定义的,object是一个import,它会自动val进入每个Scala程序。注意:请勿将 object ue scala.Predef.Map type scala.collection.immutable.Map trait别名 scala.Predef.Map[A, B],它是 def apply[A, B](elems: (A, B)*): Map[A, B] scala.collection.immutable.Map的别名。

值和类型存在于Scala中完全独立的Universe中(就像大多数其他编程语言一样),因此,它们完全有可能具有相同的名称,因为它们永远不会出现在相同的上下文中,因此永远不会模棱两可。

因此,让我们看一下the documentation for Map.apply,以告诉我们它的作用:

  

Map

     

类型为Map.apply的集合,其中包含给定的键/值绑定。

因此,Map返回一个apply,其中包含我们作为参数传递的键/值对。但是,等等,(A, B)的类型为Tuple2的{​​{3}}(repeated parameters的类型为syntactic sugar),但是我们没有传递(1, 2), (2, 4),即我们不是将1 -> 2, 2 -> 4作为参数传递,而是将1 -> 2 作为参数传递,那么这是什么呢?

请记住,与许多其他语言相比,在Scala中允许使用的标识符范围要大得多。还请记住,可以不使用句点来调用方法,并且如果不使用句点来调用方法并且仅传递单个参数,则可以省略括号。因此,

1 ->(2)

相同
1.->(2)

相同
->

所有这些操作就是在1上传递方法2调用方法Any(这只是一个无聊的标准Scala方法名称,一点也不特殊)。现在,事实证明是Tuple2[A, B],但是有一个Int doesn't have a -> methodimplicit class ArrayAssoc->的方法添加到Tuple2[A, B]类型,并且…tadaaa…返回1 -> 2

好的。全部放在一起:

1 ->(2)

相同
1.->(2)

相同
ArrowAssoc.->

实际上正在调用(1, 2) 并返回

new Tuple2(1, 2)

的语法糖
2 -> 4

(与Map(new Tuple2(1, 2), new Tuple2(3, 4)) 相同)传递给

scala.Predef.Map(new Tuple2(1, 2), new Tuple2(3, 4))

实际上是

scala.collection.immutable.Map(new Tuple2(1, 2), new Tuple2(3, 4))

已分配给

scala.collection.immutable.Map.apply(new Tuple2(1, 2), new Tuple2(3, 4))

实际上是

trait scala.collection.immutable.Map[Int, Int]

返回1的一些未指定实现类的新实例,该实例的键2与值2相关,而键4与值{ {1}}。

  

这是返回值:

scala.collection.immutable.Map[Int, Int] = Map(1 -> 2, 2 -> 4)

要学究:这是返回值的字符串表示形式,通过在其上调用toString()获得。 Map会覆盖toString(),并使用可能用于构造它的同一->来表示其内容。