此表达式有什么作用?
^(?=[0-9a-f,]+$)[^,](?:[^,]{2})*(?:,[^,](?:[^,]{2})*)*$
这是返回值:
val m = Map(1 -> 2, 2 -> 4)
答案 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 definition。 val
定义没有值。
不过,=
之后的部分是一个表达式。
val m = Map(1 -> 2, 2 -> 4)
在Scala中,foo(bar)
可能是以下两件事之一:
foo
隐式地调用方法this
,并以bar
作为参数。apply
on the object obtained by evaluating the expression foo
passing bar
as an argument。所以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 ->
method将implicit 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()
,并使用可能用于构造它的同一->
来表示其内容。