JavaからScalaに移ったときに(微妙に)はまった点
ようやくScalaのEclipseプラグインがまともに動くようになったので、順次Scalaで書くように移行訓練中です。その中で微妙にはまったり悩んだりした点など。
配列のインデックス
ほかの多くの言語とは違い、配列のインデックスはで囲うのでは無く、()で囲います。
配列使っている行でエラー表示されているときは、大体このエラーでした。identifierが
指定されていないというエラーメッセージが出てくるので、結構原因に悩みました。
(をコンパイラは型指定子と判断している)
配列、List、Map、Setの初期化
Javaとは違いScalaではこれらコレクションの初期化にnewは使いません。
配列はval a = Array()と書きますし、List、Map、Setも同様にList()、
Map()、Set()と書いて初期化します。
要素の追加ってどうすんの?
コレクション見るとaddメソッドが無くてどうしたもんかと悩みました。
コレクションに対する要素の追加は+=演算子で行います。
Set[Int]に対する要素の追加は例えば、
import collection.mutable._ val set = Set(1,2) set += 3
の様に行います。この例ではmutableなCollectionを使っていることに注意。
ちなみに+演算子は要素を追加した新しいコレクションを返す、破壊的代入
を行わないものです。
addAllどこ?
コレクションでよく使うメソッドである、addAllメソッドも見当たりません。
これは++=演算子で行います。
import collection.mutable._ val set = Set(1,2) set ++= Set(3,4)
map.entrySet()が無い
どーすんねん、keysはあるからmap(key)と書いてvalue取得すんのか?
とか思ってましたが、当然同じことは別のメソッドでできます。
toIterableを使えばよいのです。
val map = Map(1 -> 2, 2-> 3) for (val x <- map.toIterable) { println(x._1 + ":" + x._2) }
条件演算子は?
直接の条件演算子はScalaにはありません。しかし、Scala
ではifが文では無く式で値を返しますので実は以下のように
書けてしまいます。(恐ろしいことに)
val it = if (true) 3 else 4
breakは?
コップ本やら何やらではScalaにはbreakもcontinueも無いとあります。
これはJava風のループ処理をやるにはかなり面倒な問題です。
と、思っていたらScala2.8になってbreak入りました。9/4のScala座で
知りました。感謝感謝。コード例は以下の通り。
import util.control.Breaks.{break, breakable} var a = 0 breakable { while (true) { a += 1 if (a > 9) break } }
で、continueはどうやるのかというと
Scala2.8にも入ってません。ifで何とかしろとのことです。(ま、確かにね