LL脳がscalaの勉強を始めたよ その2


昨晩は唐揚げ祭りという名目で飲んでしまったので、2章の残り半分だけ。

とりあえず継続することを第1にしてみようかと…継続すげー苦手なんですが(´・ω・`)

第2章の後半

前半では対話式コンソールでサンプルを実行していたけれども、後半からはファイルに記述してスクリプト形式で実行する内容。

ちょっとしたお作法を学びつつサンプルを打ち込むことに。以下はメモ形式で…

文字列の囲み文字

"(ダブルクォーテーション)のみでシングル不可。

println("これはOK")

println('これはだめ')

うん、他言語だと当たり前なのかもしれないけども、PHPなんかだとシングル・ダブルが混在するからその方が良いのかも。PHPだとメタ文字系がダブルクォーテーションのみだったりで混乱することが多かったので…

某かの深遠なる理由があるのだろうけど、初学者には判りづらいしHTMLの属性指定とかぶったりが多かったし…で、あまり好みではない仕様だったので

改行記号

行末の";"はあっても良いけど、なし推奨

pythonで慣れてるから違和感がなかったけども…不安になる気持ちはなんとなくわかる

インクリメント

””++i"とかi++"は無いから i+=1 もしくは i = i +1使えとのこと、i++地味に便利なんだけど、まあPythonも無いからなぁ

標準出力

printlnで改行つき、printで改行なし標準出力らしい、改行コードを埋めこまなくていいのでちょっと嬉しい。

pythonでいう"ptint('hoge')" "print('hoge'),"みたいな使い分けになるわけね(pythonは ","付きでno改行 )

配列のキー

scalaでは配列のキーを()でくくるのにちょっと違和感。ずっと[]指定だったからなんだけども。

例えばhoge配列の3番目の要素を指定する場合は次の形式になる

hoge(2)
スクリプト実行時の引数

スクリプト実行の際の引数はargs配列に格納する。ちょい処理するときに便利なのでメモ。

よく目にするループ

散々「これはscalaが推奨しないやり方だけどねー」を強調されるforループの話。mutable(var)変数が存在してるのはscala的じゃないんだよ!、var殲滅!、絶対!!という主張。

とりあえず(ダメ)コードを書いてみると

var i = 0
while( i <  args.length) {
    println(args(i))
    i += 1
}

んで、実行結果

% scala test.scala hoge huga
hoge
huga

とりあえず実行できてるけどもvarはなくそう!という主張で次のセクション

関数型で繰り返そうぜ

関数のリテラルはこんな感じになるとのこと

(変数:型, 変数:型) => 処理

実際に使うときはこんなイメージかしら?

'オブジェクト'.'メソッド'(変数:型, 変数:型) => 処理


先程のループをforeach的に実行してみる、この例だと処理の部分でprintlnを実行してるわけね

args.foreach((arg:String) => println(arg))

実行結果は上と同じ

% scala test.scala hoge huga moge
hoge
huga
moge

ちなみに型指定を省略すると、結構あっさりと

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

さらに特殊条件(8章で解説されるので、またあとで)省略を活用すると、こんなにも短く!(通販風に)

args.foreach(println)


繰り返しの中でのargはvalで再定義されるので、上記の内容にvarは存在しないimmutableヽ(´ー`)ノバンザーイ!!になるそうです。

んじゃ?forっぽく書くには?

for風はこんな塩梅になるとのこと。=>と<-で方向が変わるのがご愛嬌

for(arg <- args){
  println(arg)
}

磯野〜、めんどくさいから括弧省略しようぜ〜

for(arg <- args)
  println(arg)

ワンライナー風にするとこんなにm(ry

for(arg <- args)  println(arg)

以上ー

ざっくりと処理の書き方をなぞることができたのでした。3章からもう少し複雑なことをやるらしいのでwktkしつつ進めていこうかと思います。

おまけ:ちょっと疑問に思ったことメモのために恥を公開

ループ内でval再定義だったら、複数の型の変数を連続で突っ込めるのかしら?と血迷って下のようなテストコードを書いてみたものの、書く前に予想できなかった俺反省。

var jointext = ""
for(arg <- args) jointext += arg
println(jointext)

実行結果

% scala test.scala 123hoge huga moge
123hogehugamoge
当たり前の結論

型推論があるから、しょっぱなのjointext定義時に追加されるすべての引数がStringで扱われるでしょー、そもそもvar使ってんなよ…というオチでしたとさ