コードが機能しなかった理由と、実際に何をしていたのかを少し明確にするため。
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
、関数自体を期待します。
まだ完全に慣れていない言語の別の予期しない微妙な点は、私たちを驚かせる可能性があります。