在 Scala 中,为什么 Array( "1" ) ++ "-3"输出 Array[Any] = Array(1, -, 3)?

  • 本文关键字:Array Any 输出 Scala scala
  • 更新时间 :
  • 英文 :


为什么在 Scala 2.12.6 中Array("1") ++ "-3"输出res1: Array[Any] = Array(1, -, 3)

我如何获得Array("1", "-3")结果?

++运算符将两个列表(或其他集合(连接在一起。由于字符串本质上只是一个字符列表,正如 @senjin.hajrulahovic 指出的那样,编译器以这种方式处理它(并返回一个Array[Any]

您可以通过多种方式解决此问题。例如,Array("1") ++ Array("-3")(将两个数组相加(或Array("1") :+ "-3"将值放在数组的末尾。

++binary operator(也称为方法(,用于连接两个 collections.eg。Arrays 或Lists。 如果第一个操作数是Array,则结果默认为Array。 如果第一个操作数是List,则结果默认为List

默认情况下,编译器将"-3"视为String。 所有字符串也可以被视为集合(在需要时通过隐式转换(。但是什么类型的收藏?是Array吗?是List吗?取决于其使用情况以及操作它的集合类型。

例如 当使用它作为Array("1") ++ "-3"时,默认情况下the String"-3"将被编译器视为Array[Char],因为++的第一个操作数是一个Array(尽管默认情况下元素的类型总是由编译器Char( 当使用它作为List("1") ++ "-3"时,默认情况下the String"-3"将被视为List[Char],因为++的第一个操作数是一个List(尽管默认情况下元素的类型总是由编译器Char(

++运算符遇到两个操作数都是不同类型元素的集合时,它们在type-hierarchy中最接近super-type将是结果集合的元素类型。Stringsuper-type,即第一操作数(集合(和Char的元素类型, 第二个操作数(集合(的元素类型是Any。 所以Array("1") ++ "-3"的结果是Array[Any]

如果要将String"-3"作为元素添加到集合中,Array("1"),则必须将其作为元素添加到此集合中。还有另一种方法,即:++:将元素追加或预置到集合中,如下所示。

要追加到集合,请执行以下操作:

scala> Array("1") :+ "-3"
res6: Array[String] = Array(1, -3)

要附加到集合,请执行以下操作:

scala> "-3" +: Array("1")
res7: Array[String] = Array(-3, 1)

执行上述操作的另一种方法如下(将元素转换为集合并使用++方法(:

scala> Array("1") ++ Array("-3")
res9: Array[String] = Array(1, -3)
scala> Array("-3") ++ Array("1")
res10: Array[String] = Array(-3, 1)
scala>

因为 scala 将"-3"视为'-''3'的字符序列。

如果要将字符串"-3"附加为一个元素,请使用:+

最后我在这里找到了解释。

以下是那里的摘录(逐字

(。

如何将(追加和预置(元素添加到数组

您不能调整 ScalaArray的大小,但您可以使用这些运算符 (方法(在分配时将元素追加和预置到数组 新变量的结果:

┌──────────────────────────┬─────────────────┬──────────────────────────────┐
│ Method                   │  Description    │  Example                     │
├──────────────────────────┼─────────────────┼──────────────────────────────┤
│ :+                       │ append 1 item   │ oldArray :+ e                │
├──────────────────────────┼─────────────────┼──────────────────────────────┤
│ ++                       │ append N items  │ oldArray ++ newArray         │
├──────────────────────────┼─────────────────┼──────────────────────────────┤
│ +:                       │ prepend 1 item  │ e +: oldArray                │
├──────────────────────────┼─────────────────┼──────────────────────────────┤
│ ++:                      │ prepend N items │ newArray ++: oldArray        │
└──────────────────────────┴─────────────────┴──────────────────────────────┘

追加和前置示例

这些示例演示如何使用这些方法追加和预置 元素到Array

val v1 = Array(4,5,6)         // Array[Int] = Array(4, 5, 6)
val v2 = v1 :+ 7              // Array(4, 5, 6, 7)
val v3 = v2 ++ Array(8,9)     // Array(4, 5, 6, 7, 8, 9)
val v4 = 3 +: v3              // Array(3, 4, 5, 6, 7, 8, 9)
val v5 = Array(1,2) ++: v4    // Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

我这里有一个对我有帮助的提示。要记住"追加"运算符做什么,请考虑:++:,它们将一个元素附加到列表中,因为它是">运算符的一侧是冒号侧 - 是'集合'侧。这告诉您哪个操作数表示什么,并且有理由进行区分。

最新更新