LL脳がscalaの勉強を始めたよ その1
ちょっとだけ手をつけて、すっかり放置してたScalaの勉強を地味に再開しましたよ。時間が経ちすぎなのでコップ本の1章目からやり直しで…orz
ほとんどLL言語しか扱ってこなかった人間がどこらへんで躓くのかという記録も何かの参考になるんじゃないかなぁ?たぶん?という主に自己満足で始めてみようかと。
ちなみにLL脳っぷりは以下のとおりです
- 普段使っている言語はPHP, JavascriptとまれにPython
- よく考えたら大学でプログラム書き始めてからずっとPHP厨じゃん、俺
- Javaの経験は大学の講義で2時間分ほど
とりあえず犬猫に邪魔をされつつも1章から2章の半分までを読了
1章
Scalaの特徴を座学的にいろいろと
Javaとの比較
JavaだとこうだけどScalaだとこんなにΣ( ゚Д゚) スッ、スゲー!!んだぜっていう話は華麗にスルー。いや、Java用語がいまいちわからないので、「そんな感じなんだー」くらいにしか感想が出ないのです。たぶん無知は罪なり。
型の話
動的言語との比較における静的型付の意義のお話については納得。普段メソッドの引数に対してに偏執的に型チェック処理を入れてしまう(小心者の)自分としては文法的な制限はとても欲しかったところなのでとても納得できる話でした。型推論っていう逃げ道もあるしねー
正直PHP6でGOTOを導入するくらいなら変数の型定義を導入して欲しいと切に願った人デス
関数型
Actorを絡めるためにHaskellが例に出てたんだけども、JavaScriptも関数型だよね?って思いながら読んでみた。JavaScriptを関数型的に使うと結構便利ーと思うことが多いので、そんなふうに自己変換しながら読んでみました。
まとめー
Scalaは他の言語のいいところどりですーヒャッハーという内容だったけども、さり気なく他言語の紹介になるので参考になるのです。
2章
Scalaプログラミングの基本についてサンプルを打ち込みながら
演算子っぽいものもメソッド
- とか*とかの演算子っぽくみえるものは、そもそもStringクラスやIntegerクラスのメソッドだというお話。
1 + 2
という書き方であっても
1.+(2)
みたいな感じですよー、という内容。まあ、使うだけだったら気にする必要はないんだけども概念として面白いなぁ…と思ったので。
var とか valとか
変数初期化後の取り扱いについて
- var: mutable (再代入可)
- val: immutable (再代入不可)
PHPとかにはない概念だったので一応メモ。いじられたくない変数っていうのは結構出てきそうだからデバッグに役立ちそう。
ちなみに関数型的なものを追求するとval Onlyが理想になるらしいとのこと。なぜ?についてはいまいち分からないので後回し。
ちなみにvalはJavaのfinal変数やC++のconst変数と同じとのこと。Javaいじるときのために覚えておこう。
関数と型宣言の話
変数の型宣言があるせいで関数の形がイマイチよくわからなくなりそうだったので、ちょろっと整理。
基本的な関数の書き方
def 関数名(引数:型, 引数:型) :戻り値の型 = {
関数の処理
}
引数はともかく戻り値の型を宣言するのに若干めんくらってしまった…けど、よく考えたら型判定が必要だから当たり前だよな、と納得。
ただし、型推論のおかげで戻りの型が自明な場合は、以下のように戻り値の型を省略可能とのこと…
def 関数名(引数:型, 引数:型) = {
関数の処理
}
本を読む前にWebでの解説記事を読んだときの混乱ポイントはコレだった。省略形が混じっている記事が結構あったので…
そもそも型宣言の概念がなかったので、下みたいに正式に書かれた時のStringがなんのオマジナイか悩んでしまってた…けれどもオマジナイ付きが正式なのね。
def hello(name:String):String = { return "Hello! " + name }
ただし、サラッと書いてあるけどreturn も省略可能。かつ、その場合に限って戻りの型も省略できるような雰囲気。詳しい話はあとから出てくる?
def join(a:String, b:String) = { a+b }
以下はエラー
def join(a:String, b:String) = { return a+b }
ブロックも省略可能なのでワンライナー風にもかける
def add(a:Int, b:Int) = a+b