こんにちは!ぐちです。
Scala学んでいますか?僕はScala Scalable Programming という書籍を順番に学んでいっているのですが、今回のループ文までの内容が2章の内容となっています。
非常に細かくわかりやすく書かれているので、よかったら読んでみてください。ということでVol.4いってみましょう!!
Vol.3はこちらからどうぞ。
whileループ
繰り返し処理というのも必ずといえるほど必要ですよね。ここら辺からScalaとJavaの大きな差である関数型言語と命令型言語の違いが顕著に現れます。が、臆することなく、そういうもんなんだなと受け入れ、習得して頂ければと思います。
今回は実行時引数から受け取った文字列を順番に表示するプログラムを作ってみましょう。
Java
カウンタ変数i
を定義し、実行時引数の数文ループするという下記の処理が思いつきますよね。
public class Main { public static void main(String[] args) { int i = 0; while(i < args.length) { System.out.println(args[i]); i++; } } }
もしくは下記のようにカウンタ変数を使わずfor
文を使う方法とかですかね?
public class Main { public static void main(String[] args) { for (String arg : args) { System.out.println(arg); } } }
Java8
ちなみに、Java8ではラムダ式を使うことができるので、下記のように記述することも可能だそうです。後述の「Scalaっぽい書き方」に似ていますね!
import java.util.Arrays; public class Main { public static void main(String[] args) { Arrays.stream(args).forEach(arg -> System.out.println(arg)); } }
Scala
Scalaで上記のプログラムを作るとしたら下記のようになりますかね。
object Main { def main(args: Array[String]) :Unit = { var i = 0; while(i < args.length) { println(args(i)); i += 1; } } }
今回のループ処理とは少し異なった話ですが、Scalaではi++
や++i
のようなインクリメント、デクリメント演算子は存在しないそうです。JavaやPHPなどを使用してこられた方々には違和感があるかもしませんが、冒頭でお伝えした通りScalaは「そういう言語」なんです。笑
また、配列の各要素にアクセスするのもJavaのように[]
ではなく、()
なんです。そういう言語なんです。笑
ただし!!上記のプログラムはScalaの言語仕様には則っていても、言語慣習からは外れています。プログラムとしては動きますが、Scalaっぽくない!とScala使いの方々に怒られちゃいます。笑
ですのでこれをScalaっぽくforeach
文を使って書き直してみましょう!
object Main { def main(args: Array[String]) :Unit = { args.foreach(arg => println(arg)) } }
どうですか?笑
たったこの1行でJavaで書いた複数行のコードと同じ処理ができるそうです。Scalaは関数型言語だから、こういうことができるそうです。僕もまだいまいちわかってないので、この先の学習で関数型言語の真髄を見せてもらいましょう!!
では今回はこの辺で。