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のインタフェースより便利とおもわれる特徴がある。
type (Structural Subtyping (構造的部分型))
実装時のキーワードはtype
Javaのクラスのようにインタフェースを実装してなくても良い。該当クラスが、typeで指定されたメソッドを実装していれば、typeで定義した型とみなされる。
typeは、Structural Subtyping (構造的部分型)のためだけの機能というわけではなくて、
- 抽象型の宣言
- 別名をつける
ための機能のようだ