Scala 例 「へえっ?!」とおもったこと

関数もオブジェクト

  • Scalaでは関数はオブジェクト扱い。
  • 関数もひとつの型をもつことになる。(X) => Yといった型。() => Unitなど。

このあたりは、JavaでなくてJavaScriptとかRubyに似ている。

scalaコマンドを実行して、REPLで試してみると、

scala> val f = {s:String => println(s)}
f: (String) => Unit = <function1>

scala> f("test")
test

scala> val g = f
g: (String) => Unit = <function1>

scala> g("test")
test

記号に見えるけど実はメソッド

Scalaソースコードを書くと、演算子のような記号がやたらでてくるのだが、これはほとんどがメソッド。

Scala Standard Library 2.12.8 - scala.collection.immutable.Listあたりをみると、それが良く見てとれる。

名前が:で終わるメソッド

名前が:で終わるメソッドは、レシーバーと引数を入れ替えて記述したことになる。

たとえば、
"a" :: list

"a".::(list)
ではなくて、
list.::("a")
と同じ。

Javaのinterfaceはない。代わりは、traitかtype。

Javaのinterfaceはない。代わりにつかえるのは、

  • trait
  • type (Structural Subtyping (構造的部分型))

traitもtypeもJavaのインタフェースより便利とおもわれる特徴がある。

trait

実装時のキーワードはtrait
Javaのインタフェースよりリッチ。メソッドのシグニチャだけでなく、メソッド本体を記述でき

type (Structural Subtyping (構造的部分型))

実装時のキーワードはtype
Javaのクラスのようにインタフェースを実装してなくても良い。該当クラスが、typeで指定されたメソッドを実装していれば、typeで定義した型とみなされる。

typeは、Structural Subtyping (構造的部分型)のためだけの機能というわけではなくて、

  • 抽象型の宣言
  • 別名をつける

ための機能のようだ

暗黙の型変換

forは、ループさせるだけではない。

forは、いわゆリスト包表記のためにつかえる。Haskellとか、Pythonにもあるやつ。

アクセスの可視性は、デフォルトは、public。Javaよりも細かく制御できる。

Javaでは、アクセスの可視性は、デフォルトは、同じパッケージ内ならアクセス可能だった。

Scalaでは、アクセスの可視性は、デフォルトは、publicになっている。また、Javaよりも細かく制御できる。private[X]のような記述方法で制御する。