$30 off During Our Annual Pro Sale. View Details »

5分でわかる Kotlin Contracts

kumamotone
October 01, 2019

5分でわかる Kotlin Contracts

kumamotone

October 01, 2019
Tweet

More Decks by kumamotone

Other Decks in Technology

Transcript

  1. 5෼ͰΘ͔Δ Kotlin Contracts
    2019/10/01 potatotips #65
    twitter.com/kumamo_tone

    View Slide

  2. • iOS/AndroidΤϯδχΞˏϠϑʔ
    • ษڧձӡӦ
    • Bonfire iOSɺWWDC Extended ͳͲ
    • ϠϑʔLODGEͰͷpotatotips͸4ճ໨
    ۽ຊ ࿨ਖ਼ (@kumamo_tone)

    View Slide

  3. 2019.08
    Kotlin 1.3.50
    2018.10
    Kotlin 1.3
    2019.?
    Kotlin 1.4
    όʔδϣϯͷਪҠ

    View Slide

  4. 2019.08
    Kotlin 1.3.50
    2018.10
    Kotlin 1.3
    2019.?
    Kotlin 1.4
    όʔδϣϯͷਪҠ
    ৽ػೳ$POUSBDUT͕ొ৔

    View Slide

  5. 2019.08
    Kotlin 1.3.50
    2018.10
    Kotlin 1.3
    2019.?
    Kotlin 1.4
    όʔδϣϯͷਪҠ
    ·ͩ&YQFSJNFOUBM͕ͩɺ
    4UEMJCͰ΋ͨ͘͞Μ࢖ΘΕ͍ͯΔ

    View Slide

  6. ๩͍͠ਓͷͨΊͷ
    5෼ͰΘ͔Δ Kotlin Contracts

    View Slide

  7. • ίϯύΠϥʹ໌ࣔతʹؔ਺ͷ;Δ·͍Λڭ͑Δ΋ͷ
    • ίϯύΠϥͷ੍໿Λ؇ΊΔ͜ͱ͕Ͱ͖Δ
    Contracts ͱ͸

    View Slide

  8. • ίϯύΠϥʹ໌ࣔతʹؔ਺ͷ;Δ·͍Λڭ͑Δ΋ͷ
    • ίϯύΠϥͷ੍໿Λ؇ΊΔ͜ͱ͕Ͱ͖Δ
    Contracts ͱ͸
    ίϯύΠϥͷ੍໿ʁʁʁ

    View Slide

  9. εϚʔτΩϟετ
    fun getString(s: String?): String {
    return if (s == null || s.isEmpty()) {
    "ۭͩΑ"
    } else {
    s
    }
    }

    View Slide

  10. εϚʔτΩϟετ
    fun getString(s: String?): String {
    return if (s == null || s.isEmpty()) {
    "ۭͩΑ"
    } else {
    s
    }
    }
    s ͸ίϯύΠϥʹΑͬͯ
    String? ͔Β String ʹ
    Ωϟετ͞Ε͍ͯΔ

    View Slide

  11. εϚʔτΩϟετʹͳΒͳ͍ྫ
    fun String?.isNullOrEmpty(): Boolean {
    return this == null || this.isEmpty()
    }
    fun getString(s: String?): String {
    return if (s.isNullOrEmpty()) {
    "ۭͩΑ"
    } else {
    s
    }
    }
    ֦ுؔ਺ʹͯ͠Έͨ

    View Slide

  12. εϚʔτΩϟετʹͳΒͳ͍ྫ
    fun String?.isNullOrEmpty(): Boolean {
    return this == null || this.isEmpty()
    }
    fun getString(s: String?): String {
    return if (s.isNullOrEmpty()) {
    "ۭͩΑ"
    } else {
    s
    }
    }
    Type mismatch.
    Required: String
    Found: String?

    ίϯύΠϧΤϥʔ

    View Slide

  13. εϚʔτΩϟετʹͳΒͳ͍ྫ
    fun String?.isNullOrEmpty(): Boolean {
    return this == null || this.isEmpty()
    }
    fun getString(s: String?): String {
    return if (s.isNullOrEmpty()) {
    "ۭͩΑ"
    } else {
    s!!
    }
    }

    View Slide

  14. εϚʔτΩϟετʹͳΒͳ͍ྫ
    fun String?.isNullOrEmpty(): Boolean {
    return this == null || this.isEmpty()
    }
    fun getString(s: String?): String {
    return if (s.isNullOrEmpty()) {
    "ۭͩΑ"
    } else {
    s!!
    }
    }

    View Slide

  15. @kotlin.internal.InlineOnly
    public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
    returns(false) implies (this@isNullOrEmpty != null)
    }
    return this == null || this.length == 0
    }

    View Slide

  16. @kotlin.internal.InlineOnly
    public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
    returns(false) implies (this@isNullOrEmpty != null)
    }
    return this == null || this.length == 0
    }
    $POUSBDUʰʰܖ໿ʱʱ

    View Slide

  17. ʰ͜ͷؔ਺͕GBMTFΛฦ͢ͱ͖ɺ
    ͜ͷ$IBS4FRVFODF͸OVMMͰ͸
    ͳ͍͜ͱΛอূ͢Δʂʱ
    @kotlin.internal.InlineOnly
    public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
    returns(false) implies (this@isNullOrEmpty != null)
    }
    return this == null || this.length == 0
    }

    View Slide

  18. @kotlin.internal.InlineOnly
    public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
    returns(false) implies (this@isNullOrEmpty != null)
    }
    return this == null || this.length == 0
    }
    ʰ͜ͷؔ਺͕GBMTFΛฦ͢ͱ͖ɺ
    ͜ͷ$IBS4FRVFODF͸OVMMͰ͸
    ͳ͍͜ͱΛอূ͢Δʂʱ

    View Slide

  19. @kotlin.internal.InlineOnly
    public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
    returns(false) implies (this@isNullOrEmpty != null)
    }
    return this == null || this.length == 0
    }
    Θ͔ͬͨΑʙ
    ίϯύΠϥ

    View Slide

  20. fun getString(s: String?): String {
    return if (s.isNullOrEmpty()) {
    "ۭͩΑ"
    } else {
    s
    }
    } T͸OVMM͕อূ͞ΕͯΔͷͰ
    εϚʔτΩϟετ
    ͓͍ͯͨ͠Αʙ
    ίϯύΠϥ
    TPTNBSUʜʜ

    View Slide

  21. SVO XJUI
    BQQMZ
    BMTP
    είʔϓؔ਺
    ࢛ఱԦ
    StdlibͰ͔ͭΘΕ͍ͯΔ΄͔ͷྫ

    View Slide

  22. val answer: Int
    run {
    answer = 42
    }
    print(answer)
    run (Kotlin 1.2)
    ɺଖΕ͸
    ੜ໋ɺӉ஦ɺͦͯ͠ສ෺ʹ͍ͭͯͷ
    ڀۃͷٙ໰ͷ౴͑ʜ
    ΫΫΫʜ

    View Slide

  23. run (Kotlin 1.2)
    ͳΜʜͩͱʜ
    ʢେৎ෉ͩͱࢥ͏Μ͚ͩͲͳʜʣ
    ෳ਺ճݺ͹ΕͨΒ
    ͋Ϳͳ͍Αʙ
    ίϯύΠϥ
    $PNQJMFSFSSPS
    $BQUVSFEWBMVFTJOJUJBMJ[BUJPO
    JTGPSCJEEFOEVFUPQPTTJCMFSFBTTJHONFOU
    val answer: Int
    run {
    answer = 42
    }
    print(answer)

    View Slide

  24. @kotlin.internal.InlineOnly
    public inline fun T.run(block: T.() -> R) = block()
    @kotlin.internal.InlineOnly
    public inline fun T.run(block: T.() -> R): R {
    contract {
    callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
    }
    run (Kotlin 1.3)

    View Slide

  25. @kotlin.internal.InlineOnly
    public inline fun T.run(block: T.() -> R): R {
    contract {
    callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
    }
    $POUSBDUʰʰܖ໿ʱʱ

    View Slide

  26. @kotlin.internal.InlineOnly
    public inline fun T.run(block: T.() -> R): R {
    contract {
    callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
    }
    ʰ͜ͷϒϩοΫ͸ʜ
    ʰͨͬͨ౓ͷΈඞ࣮ͣߦ͞ΕΔʂʂʱʱ

    View Slide

  27. @kotlin.internal.InlineOnly
    public inline fun T.run(block: T.() -> R): R {
    contract {
    callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
    }
    Θ͔ͬͨΑʙ
    ίϯύΠϥ

    View Slide

  28. Ұ౓͔͠ݺ͹Εͳ͍ͳΒ
    ॳظԽͯ͠΋҆શ͔ͩΒɺ
    ڐՄ͓͍ͯͨ͠Αʙ
    ίϯύΠϥ
    TPTNBSUʜʜ
    val answer: Int
    run {
    answer = 42
    }
    print(answer)

    View Slide

  29. ݴ༿ʹ͠ͳ͍ͱɺ఻ΘΒͳ͍͜ͱ΋͋Δʢʁʁʁʣ
    http://gahag.net/001427-businessman-handshake/

    View Slide

  30. • Contractsͱ͸
    • Kotlin 1.3 Ͱ௥Ճ͞ΕͨػೳʢExperimentalʣ
    • isNullOrEmpty/run/with/apply/alsoͳͲStdlibͰଟ਺࢖ΘΕ͍ͯΔ
    • ίϯύΠϥʹ໌ࣔతʹؔ਺ͷ;Δ·͍Λڭ͑Δ͜ͱͰɺ

    ίϯύΠϥͷ੍໿Λ؇ΊΔ͜ͱ͕Ͱ͖Δ
    ·ͱΊ

    View Slide

  31. • What’s New in Kotlin 1.3
    • https://kotlinlang.org/docs/reference/whatsnew13.html
    • What's new in Kotlin?
    • https://speakerdeck.com/svtk/whats-new-in-kotlin
    • վΊֶͯͿContracts
    • https://speakerdeck.com/tommykw/gai-metexue-hucontracts
    References

    View Slide