1

我是初学者,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)

我不明白 in 是什么意思,:+如果scala我添加"ins"+acc:+1 它正在转换为向量集合inscala

有人请帮我吗?

4

4 回答 4

4

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

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)。因此它会打印一个如图所示的序列。

于 2013-10-09T06:09:47.853 回答
1

我也在学习 Scala,而且有很多疯狂的运算符。

基本上,:+将项目附加到列表的副本。此处定义了:+运算符:List

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

现在使用您的 String 示例,它变得很棘手。Scala 有一个Type被调用String(在scala.Predef中定义),它是java.lang.String. 我没有看到:+为 定义的位置String,但它似乎尽其所能地做类似的行为。将运算符右侧的内容附加到,String但生成一个Vector作为通用序列。那种感觉是有道理的。请记住,ScalaVector与 Java 不同。

希望有帮助。

于 2013-10-09T06:14:34.907 回答
0

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

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

"ins"+acc:+1比较棘手,因为"ins"+acc首先评估并连接字符串“acc”和字符串表示acc形式`insList()。然后:+在字符串上调用,该字符串insList()会自动将其转换为 a Listof characters 并附加1. 最后这给出了结果scala.collection.immutable.IndexedSeq[AnyVal] = Vector(i, n, s, L, i, s, t, (, ), 1)

于 2013-10-09T06:09:36.553 回答
0

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

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

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

  • 请注意,就像 :+ 附加到序列一样,有一个 +: 会返回一个带有前置元素的列表副本!

  • 请注意“另请参阅”,它要求您查看列表上的“Scala 的集合库概述”部分,结果也非常令人大开眼界。

  • 阅读此 gem,“请注意 :-end 运算符是右结合的(参见示例)。+: 与 :+ 的助记符是:COLon 位于 COLlection 端

使用这种美妙、简洁、富有表现力(而且令人困惑!)的语言祝一切顺利。

于 2013-10-20T17:48:00.887 回答