読者です 読者をやめる 読者になる 読者になる

万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

Scala入門者向けハンズオン

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みたいなの。

IntelliJみたいな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は省略が不可。