高卒文系Scala vol.5 - 配列の反復処理 -


Scala本、2.5とか2.6辺りを読んで。

奥深い分野だと感じたので、現段階ではとりあえずコーディングできればいいやレベルの解釈で。



文字列配列の全ての要素を標準出力する反復処理


基礎の基礎ですね。


以下の配列を標準出力するコードを例として、手続きスタイルと関数スタイルで記述した反復処理のコードを見てみましょう。


val jobs = Array("engineer", "developer", "designer")

結果イメージ

engineer
developer
designer


手続きスタイル
var i = 0
while(i < jobs.length) {
println(jobs(i))
// Javaのi++とかは使えない
i += 1
}

ここで「for文」では無く「while文」を例に挙げたのは、Scalaには「for文」は無いからです。

Javaの「for文」に該当するのは、Scalaでは「for式」らしいです。

「for式」については、Scala本の2.5とか2.6辺りに詳細が書いてませんし、現段階では理解しきれてませんw

なのでスルー。



関数スタイル

手続きスタイルと比べると、すっごく簡単に書けます。


jobs.foreach(arg => println(arg))

Array#foreachを呼び出して、引数に関数を渡しているのですが、

Javaしかやってきてない人にはパッと見イミフだと思います。


もうちょっと冗長に書くと、↓のようになります。


val func = (job:String) => println(job)
jobs.foreach(func)

funcの宣言・初期化している行の右辺は、「関数リテラル(function literal)」です。

「(job:String)」が引数定義で、「=>」の右側が関数の本体です。


その行で関数を定義して、その関数オブジェクトをfuncに代入しています。


funcをjobsのforeachメソッドの引数に渡すと、jobsの最初の要素から最後の要素まで順にfuncの引数に渡されて実行されます。



ちなみにこの例だと、Scalaの「部分適用された関数(partially applied function)」を使って、

さらに簡単に記述できます。


jobs.foreach(println)

「部分適用された関数」とは、「全ての引数を渡していない関数呼び出しの式」らしいですが、

詳細は8.6説らしいので、それまで我慢。



まとめ


基礎中の基礎すぎですが、Scalaの反復処理の詳細はScala本2章では「後の章にオアズケ」なので、こんなところでしょうか。


Scalaでプログラミングする時は、「いかに関数スタイルで書くか」という事を考えながらやるのが面白そうですねー

このエントリーをはてなブックマークに追加
comments powered by Disqus