Upgrade to Pro — share decks privately, control downloads, hide ads and more …

変態文法とKotlin Puzzlers

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for Taro Nagasawa Taro Nagasawa
April 01, 2018
1.4k

変態文法とKotlin Puzzlers

Avatar for Taro Nagasawa

Taro Nagasawa

April 01, 2018
Tweet

Transcript

  1. fun f(x: String) { x.fun String.() { println(toUpperCase()) }() }

    Stringの拡張関数を 無名関数として定義して 即実行している
  2. val x = object: (()->Unit)->Unit by {}{}{} object: (()->Unit)->Unit by

    {}{}{} object: (Function0<Unit>)->Unit by {}{}{} 関数型() -> Unit は インタフェースFunction0<Unit>
  3. val x = object: (()->Unit)->Unit by {}{}{} object: (()->Unit)->Unit by

    {}{}{} object: (Function0<Unit>)->Unit by {}{}{} object: Function1<Function0<Unit>, Unit> by {}{}{}
  4. val x = object: (()->Unit)->Unit by {}{}{} object: (()->Unit)->Unit by

    {}{}{} object: (Function0<Unit>)->Unit by {}{}{} object: Function1<Function0<Unit>, Unit> by {}{}{} インタフェースのオブジェクト式(=無名クラス化)
  5. val x = object: (()->Unit)->Unit by {}{}{} object: (()->Unit)->Unit by

    {}{}{} object: (Function0<Unit>)->Unit by {}{}{} object: Function1<Function0<Unit>, Unit> by {}{}{} 何もしない関数であるラムダ式{}にbyにより委譲
  6. val x = object: (()->Unit)->Unit by {}{}{} object: (()->Unit)->Unit by

    {}{}{} object: (Function0<Unit>)->Unit by {}{}{} object: Function1<Function0<Unit>, Unit> by {}{}{} 無名クラスの本体ブロック
  7. val x = object: (()->Unit)->Unit by {}{}{} object: (()->Unit)->Unit by

    {}{}{} object: (Function0<Unit>)->Unit by {}{}{} object: Function1<Function0<Unit>, Unit> by {}{}{} 無名クラス(1つの引数を取る関数)の即時実行で、 ラムダ式を渡している
  8. val x = 0 fun y(): Int.()->Unit = {} fun

    main(args: Array<String>) { x.(y())() }
  9. nullがNothingであるおかげで... nullがあらゆるnull許容型変数に代入可能 val a: String? = null val b: Int?

    = null val c: List<Foo>? = null returnやthrowがNothingであるおかげで... Nullable -> NotNull 変換が捗る val x: Foo = xx ?: return val y: Bar = yy ?: throw Exception()
  10. fun main(args: Array<String>) { { return@main } print("A") run {

    return@main } print("B") } -------------------------------------------- 1) 何も起こらない 2) 「A」と出力される 3) 「AB」と出力される 4) コンパイルエラー
  11. fun main(args: Array<String>) { { return@main } print("A") run {

    return@main } print("B") } -------------------------------------------- 1) 何も起こらない 2) 「A」と出力される 3) 「AB」と出力される 4) コンパイルエラー
  12. fun main(args: Array<String>) { val f: String.() -> Unit =

    ::print "A".f() f("B") } --------------------------------------------- 1) 何も起こらない 2) 「A」と出力される 3) 「AB」と出力される 4) コンパイルエラー
  13. fun main(args: Array<String>) { val f: String.() -> Unit =

    ::print "A".f() f("B") } --------------------------------------------- 1) 何も起こらない 2) 「A」と出力される 3) 「AB」と出力される 4) コンパイルエラー
  14. fun main(args: Array<String>) { var a: Int? = -128 val

    b: Int? = -129 print(a === -128); print(", ") print(a?.minus(1) === -129); print(", ") print(b === -129) } --------------------------------------------- 1) 「true, true, true」と出力される 2) 「true, false, true」と出力される 3) 「true, true, false」と出力される 4) コンパイルエラー
  15. fun main(args: Array<String>) { var a: Int? = -128 val

    b: Int? = -129 print(a === -128); print(", ") print(a?.minus(1) === -129); print(", ") print(b === -129) } --------------------------------------------- 1) 「true, true, true」と出力される 2) 「true, false, true」と出力される 3) 「true, true, false」と出力される 4) コンパイルエラー
  16. fun main(args: Array<String>) { val (x) = object { operator

    fun component0() = "Zero" operator fun component1() = "One" override fun toString() = "Unknown" } println((x)) } --------------------------------------------- 1) 「Zero」と出力される 2) 「One」と出力される 3) 「Unknown」と出力される 4) コンパイルエラー
  17. fun main(args: Array<String>) { val (x) = object { operator

    fun component0() = "Zero" operator fun component1() = "One" override fun toString() = "Unknown" } println((x)) } --------------------------------------------- 1) 「Zero」と出力される 2) 「One」と出力される 3) 「Unknown」と出力される 4) コンパイルエラー