1

これとほぼ同等の 1 行で配列を作成して初期化しようとしています。

var characterMap = new Array[List[ActorRef]](sizeX*sizeY)
characterMap.indices.foreach(characterMap(_) = Nil)

これはうまくいかないようです:

var characterMap = ((0 until sizeX*sizeY) map Nil).toArray[List[ActorRef]] 

しかし、これは:

var characterMap = (for (_ <- 0 until sizeX*sizeY) yield Nil).toArray[List[ActorRef]]

私はそれらが同等だと思いましたか?

4

2 に答える 2

4
var characterMap = (for (_ <- 0 until sizeX*sizeY) yield Nil).toArray[List[ActorRef]]

に翻訳されます:

var characterMap = (0 until sizeX*sizeY).map(_ => Nil).toArray[List[ActorRef]]

これはうまくいくはずです。

些細なこと: それらは同等ではなく、同じです。forただの砂糖構文です。

ちなみに、次のことを検討してください。

Array.fill[List[ActorRef]](sizeX*sizeY)(Nil)
于 2013-06-07T00:36:26.830 に答える
0

コードが機能しなかった理由と、実際に何をしていたのかを少し明確にするため。

val characterMap = ((0 until 10) map Nil)

分かりやすいように少し簡略化しています。

(0 until 10)メソッドが(他のコレクションなどと同様に)型 の関数を期待するオブジェクトRangeです。map(A) => B
A = Int

タイプチェッカーは に満足しているので、何らかの形で関数でなければならないmap Nilように見えますね。Nil(Int) => B

ここでのポイントは、実際に存在するNil(i: Int)構文シュガーとして使用できることです!Nil.apply(i: Int)

i 番目の要素を取得するのは、一般的な順次コレクション メソッドです。

(0,1,...,9)上記のコードを実行すると、範囲要素をオブジェクトの対応するインデックス付きの値に変換しようとしNilます。これは空のList

もちろん、空のリストには要素がないため、次のようにエラーがスローされます

scala> val characterMap = ((0 until 10) map Nil)
java.lang.IndexOutOfBoundsException: 0
    at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:52)
    at scala.collection.immutable.List.apply(List.scala:84)
    at scala.collection.immutable.List.apply(List.scala:84)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
    at scala.collection.immutable.Range.foreach(Range.scala:141)
    at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
    at scala.collection.AbstractTraversable.map(Traversable.scala:105)
    ...

結論

yield意味的mapな意味は同じですが、構文規則がわずかに異なります。

yieldマップされた関数の結果を期待しながらmap、関数自体を期待します。

まだ完全に慣れていない言語の別の予期しない微妙な点は、私たちを驚かせる可能性があります。

于 2013-06-08T14:35:22.420 に答える