28

在javascript中,我们可以这样做:

["a string", 10, {x : 1}, function() {}].push("another value");

Scala 等价物是什么?

4

4 回答 4

41

Scala 中的数组非常同质。这是因为 Scala 是一种静态类型语言。如果你真的需要伪异构特性,你需要使用参数化协变的不可变数据结构(大多数不可变数据结构都是)。 List是那里的典型示例,但Vector也是一种选择。然后你可以做这样的事情:

Vector("a string", 10, Map("x" -> 1), ()=>()) + "another value"

结果将是类型Vector[Any]。在静态类型方面不是很有用,但一切都会如期而至。

顺便提一下,Scala 中数组的“文字语法”如下:

Array(1, 2, 3, 4)     // => Array[Int] containing [1, 2, 3, 4]

另请参阅有关持久向量的更多信息

于 2008-10-09T17:08:54.143 回答
18

Scala 将选择可以保存所有值的最具体的 Array 元素类型,在这种情况下,它需要最通用的类​​型Any,它是所有其他类型的超类型:

Array("a string", 10, new { val x = 1 }, () => ()) :+ "another value"

结果数组的类型为Array[Any].

于 2011-05-23T00:38:30.140 回答
4

Scala 可能很快就会获得“异构”列表的能力: Scala 中的 HList

于 2008-10-15T17:53:07.583 回答
2

正如herom 在评论中提到的那样,就个人而言,我可能会使用元组。

scala> ("a string", 10, (1), () => {})
res1: (java.lang.String, Int, Int, () => Unit) = (a string,10,1,<function0>)

但是你不能轻易地附加到这样的结构上。

ePharaoh 提到的 HList 是“为此而设计的”,但我自己可能会避开它。它对类型编程很重,因此可能会带来令人惊讶的负载(即在编译时创建很多类)。小心点。上面的 HList(需要 MetaScala 库)将是(因为我不使用 MetaScala,所以没有得到证明):

scala> "a string" :: 10 :: (1) :: () => {} :: HNil

您可以将 etc.(好吧,至少在前面)附加到这样的列表中,它会知道类型。Prepending 会创建一个以旧类型作为尾部的新类型。

然后还有一种方法尚未提及。类(尤其是案例类)在 Scala 上非常简单,您可以将它们设置为单行:

scala> case class MyThing( str: String, int: Int, x: Int, f: () => Unit )
defined class MyThing

scala> MyThing( "a string", 10, 1, ()=>{} )
res2: MyThing = MyThing(a string,10,1,<function0>)

当然,这也不会处理追加。

于 2012-11-20T07:58:31.297 回答