「Scalaスケーラブルプログラミング」7章

所感

  • 理解

    • PythonのIF式で値を返す用法はScalaにもあり,varを使わない,副作用として書かないという意味で望ましいやり方
    • whileはvarを前提として,値を返さない命令型の構文であり,望ましくない
      • 再帰で書けないか検討する
    • for は yieldで返す値を定義,結果はコレクション型.elementの型は処理に依存
      • Pythonと同じようにコレクションを逐次処理できる: element <- Array[]
        • filterもできる リスト内表記とは違う: element <- Array[] if condition(element)をfor文で受け取る
        • 複数のifを使いたい時には,間に;を用いる (最後につけるとsyntax error)
      • 入れ子は,forを2回は書かず,forの()の中にgenerator(<-)を2回書く.すると,2回目のgenerator以降が先に繰り返される
        • generatorも;で区切る必要がある
      • for 文の中で,valを省略して変数定義ができる (bind)
      • defで返り値を受け取れば,for文は関数として格納されるし,valで返り値を受け取れば,コレクションとして格納される
    • throw式もNothing型を返す,これは,ifで値を返す用法で使えるようにするのに役立つ (もちろん,値の代入が起こる前にExceptionになるが,文法エラーにはならない)
    • Finallyは値を返すべきではない,書いてもScalaでは無視される (returnを書けば強引に返せるが,混乱の元なので使わない)
    • X match {case Y => Z}で X=YのときZを返す関数, 処理のできるmapみたいな感じか
    • 変数のスコープはほぼ直感的だが,入れ子で変数を定義できる
    • リファクタリングは,等式でかける要素に分解していく,ここはPythonでもなんでも同じか
  • わからない

    • (){}の使い分け.このsectionの generator記述が() だったり {} だったりしている.
      • val a = 0; {val a=1} については再現できず,コンパイルエラーとなる