前回の続き。4.3 のトレイトと抽象クラス から、という事で。
-
trait は具象関数を含んだ interface
-
abstract なクラス定義も可能
-
Kotlin は移譲をサポートしている
む、これ面白いな。
class Person(g : Greeter) : Greeter by g
という記述にてこうした時に
var greeter = GreeterImpl("world")
var person = Person(greeter)
Person では
fun greet() {
g.greet()
}
が追加されている、ということなのか。
クラスオブジェクト
- static なメンバという概念はなくてクラスオブジェクト、というものを使う模様。
- スーパータイプが設定できる
匿名クラス
以下な記述とのこと。
trait Foo {
fun foo() : String
}
val bar = object : Foo {
override fun foo() = "bar"
}
object declaration
以下が singleton なオブジェクトを使う例、とのこと。
trait Foo {
fun foo() : String
}
object Bar : Foo {
override fun foo() = "bar"
}
fun main(args : Array<String>) {
println(Bar.foo()) // bar
}
ジェネリクスのあたり、ちょいスルーで。
リストの操作
Lisp な感じでの操作が可能になっているようですね。
- any, all は (T) -> Boolean な手続きを引数にいずれか、あるいは全ての要素について true を戻すかを戻す
- それぞれの要素は it で参照できるのか
- filter や map も使える
以下が例示されている。
val ints = linkedList(1, 2, 3, 4, 5)
val filterdInts = ints.filter {
it % 2 == 0
}
ints には 2 の倍数しか残らないはず。Lisp てきに書くと
(filter ints (lambda (it) (= 0 (% it 2))))
みたいなカンジなのかどうか。あと、python な enumerate みたいな withIndices という関数があるようです。以下なナニが例示されています。
val list = linkedList("foo", "bar", "baz");
for(val p in list.withIndices()) {
assert(p is #(Int, String))
println("${p._1} : ${p._2}")
}
これは面白い。fold および foldRight は略します。
とりあえず
Kotlin おさらい終わったみたいなので、RxJava 方面をおさらいしてみる方向にて。