万年素人からHackerへの道

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

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1

    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は省略が不可。