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

あなたはそのようなリストに等を追加することができます(まあ、少なくとも追加します)、そしてそれはタイプを知っています。プリペンディングは、古いタイプをテールとして持つ新しいタイプを作成します。

次に、まだ言及されていないアプローチが1つあります。クラス(特にケースクラス)は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 に答える