6月5日
http://connpass.com/event/30007/
インストール手順はここが基本だが、まだ中途半端。
https://github.com/mike-neck/scala-study/wiki/%E6%BA%96%E5%82%99
ダウンロードから
mv activator-dist-1.3.10 /usr/local/share/
zshrcにセット
export PATH="/usr/local/share/activator-dist-1.3.10/bin:$PATH"
ちゃんと最後に:$PATH
つけないとおかしくなるよ。
brewでやる
brew install typesafe-activator
IDEでのセットアップ()
※ドワンゴの資料がいいかも? https://dwango.github.io/scala_text/IDE.html
開き方
activatorで作成したプロジェクトをインポートするときに適当に開いたら上手く実行ができない。 build.sbtを開いた状態で ちゃんと「Import Project」で開かないといけないと思う。
プラグインはこうやって入れる。
そのあとで、Run -> Runで実行できるはず。
しかし、僕はテラテイルで質問した。 https://teratail.com/questions/36989?complete= 「Import Project」が重要。
講座
src/main/scala
あたりはScala独自ではなくJavaの慣習ですね。mavenやgradleでもそうなってます
build.sbt 依存ライブラリを入れる。
~/hello-scala activator
※Macで./activator
じゃないとダメな人もいる?
この状態で
> run
.activator
が昔あったが、今はないとのこと。
当時は./activator
していたらしい。
差分コンパイル。
SDTを生で使ってもいい。 activatorが、SDTをラップしている。
ProjectをNewみたいなこと。 activator uiのようなIDEみたいなの。
activatorではパッケージを配布しやすい。 activatorの公式はあるけど、あまりドキュメントはない。
.java プライベートパッケージ 複数書くことが出来る
代数的な型を作りたいとき?? enum型で、独自にインターフェイスでやりたいとき 1つのソースファイルに書くことがある。
複数のクラスに共通の処理。 Javaではデフォルトメソッドできる。
Scalaでは、traitは直接インスタンスを持つことが出来ないのでmix-inして使える。 Javaでは、interfaceをimplementsする。
似たようなstaticファクトリメソッド。 共通の振る舞いを与えるため。
sealedは他の人が勝手にmix-inして新しいインスタンス作るのを防止するため。
trait Ticket { val id: Long val title: String val status: TicketStatus = TicketStatus.Open } class Issue( id: Long, title: String, status: TicketStatus ) extends Ticket
publicなフィールドを持ってないからコンストラクタでエラーになる。 valでショートカットになる。
activatorのなかでconsole
をタイプ
new Issue(10, "test issue", app.models.TicketStatus.Open)
ワイルドカードはapp.models配下全部
import app.models._
有効な識別子が*(クラス名で使える)なので、それとかぶらないため。
import app.models.{Issue, Bug}
.
を忘れないように
caseつけるとtoString のオーバーロードしなくても自動で実装される。 あとは、メンバ変数がpublicになるので継承先でvarをかかなくても良くなる。
caseクラスをcaseクラスを継承できない →普通のクラスがcaseを継承、caseクラスが普通のクラスを継承はOk
Equalsは何を同じとみなすのか難しい。(Effective Java or コップ本)
メソッドやコンストラクタの引数にデフォルト値を設定できる。
varは再代入が出来ない
アクセス修飾子何もしないと基本的にpublic public修飾子はそもそもない。
走査可能 ( Traversable )トレイトはコレクション階層の最上位に位置する traversable・・・foreachを持っている(Rubyでいうenumerable) 要素1個で処理する。
分かれている。
要素を持った集合。 リストインターフェイス。 Arrayをモジュールにしたようなもの。 set、要素の順序の意味を持たない。 map、キーとバリューのペア。順序に意味が無い。数学的な集合
mapもiterableを継承している(Javaは継承していない)
新しく追加したのを生成して返す 同じインスタンスをコピーしている? 変化があった差分だけメモリ消費。
プログラムの作法としてimmutableが良い。 明示的にmutableにしたいときは、パッケージをインポートする必要がある。
Optionは値があるかないかわからない。 None
Nothingはすべての型の子?Bottom型。
状態をさせない(非破壊的) カッコをつける。 状態を変更 (破壊的) カッコをつけない。
習慣。
enumはnewは省略可能。 classは省略が不可。