什么是:scala中的+行?

时间:2013-10-09 05:56:19

标签: scala scala-collections

我是scala的初学者,我陷入了一条线。我正在使用scala工作表

     type Bit = Int

     var acc: List[Bit]=List()                        //> acc  : List[Listpr.Bit] = List()

     acc:+1                                           //> res0: List[Int] = List(1)

     "ins"+acc:+1                                     //> res1: scala.collection.immutable.IndexedSeq[AnyVal] = Vector(i, n, s, L, i, 
                                                  //| s, t, (, ), 1)
     println("ins"+acc:+1)                         //> Vector(i, n, s, L, i, s, t, (, ), 1)

我无法获得:+scala的含义,如果我添加"ins"+acc:+1,则会转换为scala中的向量集合

有人请帮帮我吗?

4 个答案:

答案 0 :(得分:4)

我认为scala docs很好地解释了它。

A copy of this list with an element appended.

scala> acc
res3: List[Bit] = List()

scala> acc :+ 1
res4: List[Int] = List(1)

scala> acc
res5: List[Bit] = List() 

基本上,当您执行acc:+1时,它会创建一个新列表,复制acc的元素并向其添加1。没有对acc进行任何更改。

嗯,我认为这是一个错字。我认为你的意思是(“ins”:: acc):+ 1

scala> "ins"+acc:+1
res8: scala.collection.immutable.IndexedSeq[AnyVal] = Vector(i, n, s, L, i, s, t
, (, ), 1)

scala> "ins":+acc:+1
res9: scala.collection.immutable.IndexedSeq[Any] = Vector(i, n, s, List(), 1)

scala> ("ins" :: acc) :+ 1
res10: List[Any] = List(ins, 1)

"ins"+acc:+1如图所示打印,因为scala中的String隐式为IndexedSeq。执行“ins”+ acc基本上是"ins"+acc.toString,即"insList()"。现在"insList()"的类型为IndexedSeq[Char]。对:+ 1执行此操作会使其转换为IndexedSeq[AnyVal]为(String <: AnyValInt <:AnyVal)。因此它会打印一个序列,如图所示。

答案 1 :(得分:1)

我也在学习Scala,并且有很多疯狂的操作员。

基本上,:+会将一个项目附加到列表的副本中。 :+的{​​{1}}运算符定义为here

List

现在使用您的String示例,它变得棘手。 Scala的def :+(elem: A): List[A] [use case] A copy of this list with an element appended. A mnemonic for +: vs. :+ is: the COLon goes on the COLlection side. Example: scala> import scala.collection.mutable.LinkedList import scala.collection.mutable.LinkedList scala> val a = LinkedList(1) a: scala.collection.mutable.LinkedList[Int] = LinkedList(1) scala> val b = a :+ 2 b: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2) scala> println(a) LinkedList(1) elem the appended element returns a new list consisting of all elements of this list followed by elem. Definition Classes SeqLike → GenSeqLike Full Signature def :+[B >: A, That](elem: B)(implicit bf: CanBuildFrom[List[A], B, That]): That 名为Type(在scala.Predef中定义),是String的别名。我没有看到为java.lang.String定义:+的位置,但它似乎尽可能做类似的行为。将运算符右侧的东西附加到String,但生成Vector作为通用seq。那是有道理的。请记住,Scala的String与Java的不同。

希望有所帮助。

答案 2 :(得分:0)

直接从文档:+返回“此列表的副本,并附加了一个元素”。即附加。

acc:+1直接返回List(1),这是您所期望的。将1附加到空列表中。

"ins"+acc:+1比较复杂,因为首先评估"ins"+acc并连接字符串“acc”和acc的字符串表示`insList()。然后在字符串:+上调用insList(),它会自动将其转换为List个字符,并附加1。最后,这会得到结果scala.collection.immutable.IndexedSeq[AnyVal] = Vector(i, n, s, L, i, s, t, (, ), 1)

答案 3 :(得分:0)

除了其他好的答案,我还是鼓励您自己浏览scaladoc:

http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List

您将自己发现一些事情,这将增加您对语言和标准库的信心。在您在stackoverflow上发布此内容所花费的时间,您可能

  • 请注意:正如:+附加到Sequences,有一个+:返回列表的副本,前面有一个元素!

  • 通知&#34;另见&#34;要求您查看列表中的"Scala's Collection Library overview"部分,结果也非常令人大开眼界。

  • 读取这个宝石,&#34;注意: - 结束运算符是右关联的(参见示例)。 +:vs.:+的助记符是:COLon进入COLlection方&#34;

使用这种精彩,简洁,富有表现力(并且令人困惑!)的语言,一切顺利。