2014年4月12日土曜日

Programming in Scala, First Edition: Chapter 4

4. Classes and Objects
  Javaと同じ部分が多いが、全部同じと言う訳ではない。

4.1 Classes, fields, and methods
  classの定義: members = fields + methods
    class className {
      val or var field
      def methods (...) = ...
    }
  new classNameでインスタンス化
  membersはdefaultでpublic、privateにも指定すれば出来る。
  関数の引数はval。varではない。
  returnは省略できる。最後に評価される値を返す。
  戻り値をUnitにすれば最後に評価された値も返されない。
  =なし{}で定義すると戻り値Unitを省略できる。=ありだと最後に評価される式。
    def func(a: Int) {a + 1}
    ?? procedureの様に見えて副作用を強調出来るのでこの方が推奨??
    ?? と言っても間違って=を忘れるとUnitになってしまうので注意必要とあるが??
  ** 色々な簡略化のための省略形を推奨している。
  ** style guideを見てどう書くかを確認する。

4.2 Semicolon inference
  文の終わりは;だが、殆どの場合で省略出来る。
  複数行にする際は下記にすると良い。
    二項演算子の演算子は、行頭ではなくて行末にする。
    ()[]などの中の途中で改行する。
    その他そこが文の区切りになりえない所で改行する。

4.3 Singleton objects
  singleton objectsはclassと同じファイルに同じ名前で入れるとcompanion objectsになる。
    お互いのprivateのメンバにアクセス出来る。
    Javaのstatic methodと似ている。
      更にfirst class objectsでもある。
    singleton objectsではtypeは定義されない。classの方で定義される。
    superclassを拡張したりtraitとmixed-inされる。
  singleton objectsはパラメータを取らない。new出来ない。
  singleton objectsはsynthetic classのinstanceとして実装されている。
  Javaと同じように最初にコードにアクセスされたときに初期化される。
  companion objects以外はstandalone objectsとなる。
    関連している関数をまとめる。
    scalaのエントリポイント定義する。

4.4 A Scala application
  下記のメソッドを持つstandalone objectがscalaプログラムのエントリポイント
    def main(args: Array[String]): Unit
  object名やclass名はファイル名と合わせなくても良い
    javaでは合わせる必要がある。
    javaと同様に合わせることを推奨する。
    1ファイル、1 public class, objectが推奨
  ** REPLで:paste, :power等が使える。nt-emacsだとctrl-Dが扱えない。
  java.langとscalaが元々importされている。
    Predefと言う名前のsingleton objectとして。
    println -> Predef.println -> Cosonle.println
    ** singleton objectはレシーバになっている。
      Predef println "a" はOK。
  scalacに.scalaファイルを渡してコンパイル。全部コンパイルするから遅い。
  fscと言うサーバを上げれば2回目以降は早くなる。
    fsc -shutdownで終了。
  コンパイルするとjavaのクラスファイルが出来る。
  scalaコマンドに拡張子なしでmainが含まれるクラスを渡して実行する。
    scala Summer of love
  ?? scalaコマンドを含んだバンドル??を作るには? これを作るのがsbt??

4.5 The Application trait
  scala.Applicationと言うtraitがある。
    traitは後で扱うのでここでは完全に理解できなくても良い。
  このtraitを継承すれば使えばmainの記述が不要になる。
    object FallWinterSpringSummer extends Application {
  ただし、副作用も多いので注意が必要。
    argsが使えない、multi-threadで使えない。最適化されないかもしれない。。。
  {}の内側はprimary constructorに渡されて初期化時に実行される。
    ?? mainを定義しているわけではなくて、初期化時の実行を利用している?

4.6 Conclusion
  class, object, compile, run applicationsの基本を勉強した。
  次は基本typeとその使い方。

0 件のコメント:

コメントを投稿