LL脳がscalaの勉強を始めたよ その2
昨晩は唐揚げ祭りという名目で飲んでしまったので、2章の残り半分だけ。
とりあえず継続することを第1にしてみようかと…継続すげー苦手なんですが(´・ω・`)
第2章の後半
前半では対話式コンソールでサンプルを実行していたけれども、後半からはファイルに記述してスクリプト形式で実行する内容。
ちょっとしたお作法を学びつつサンプルを打ち込むことに。以下はメモ形式で…
文字列の囲み文字
"(ダブルクォーテーション)のみでシングル不可。
println("これはOK")
println('これはだめ')
うん、他言語だと当たり前なのかもしれないけども、PHPなんかだとシングル・ダブルが混在するからその方が良いのかも。PHPだとメタ文字系がダブルクォーテーションのみだったりで混乱することが多かったので…
某かの深遠なる理由があるのだろうけど、初学者には判りづらいしHTMLの属性指定とかぶったりが多かったし…で、あまり好みではない仕様だったので
インクリメント
””++i"とかi++"は無いから i+=1 もしくは i = i +1使えとのこと、i++地味に便利なんだけど、まあPythonも無いからなぁ
標準出力
printlnで改行つき、printで改行なし標準出力らしい、改行コードを埋めこまなくていいのでちょっと嬉しい。
pythonでいう"ptint('hoge')" "print('hoge'),"みたいな使い分けになるわけね(pythonは ","付きでno改行 )
よく目にするループ
散々「これは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使ってんなよ…というオチでしたとさ