用Kotlin-koans學Kotlin【六】 v_builders

HankeXu發表於2017-10-18

36. n36ExtensionFunctionLiterals

擴充套件函式

fun task36(): List<Boolean> {
    val isEven: Int.() -> Boolean = { this % 2 == 0 }
    val isOdd: Int.() -> Boolean = { this % 2 != 0 }

    return listOf(42.isOdd(), 239.isOdd(), 294823098.isEven())
}複製程式碼

37. n37StringAndMapBuilders

型別擴充套件函式,仿照buildString實現buildMap

fun <K,V>buildMap(build:HashMap<K,V>.()->Unit):Map<K,V>{
    val map = HashMap<K,V>()
    map.build()
    return map
}複製程式碼

38. n38TheFunctionApply

使用apply重寫上一練習中的功能

fun <T> T.myApply(f: T.() -> Unit): T {
    f()
    return this
}複製程式碼

39. n39HtmlBuilders

products填充進表格,並設定好背景色,執行htmlDemo.kt可以預覽內容

fun renderProductTable(): String {
    return html {
        table {
            tr(color = getTitleColor()) {
                td {
                    text("Product")
                }
                td {
                    text("Price")
                }
                td {
                    text("Popularity")
                }
            }
            val products = getProducts()
            for ((index,product) in products.withIndex()){
                tr {
                    td(color = getCellColor(index,0)){
                        text(product.description)
                    }
                    td (color = getCellColor(index,1)) {
                        text(product.price)
                    }
                    td (color = getCellColor(index,2)){
                        text(product.popularity)
                    }
                }
            }
        }
    }.toString()
}複製程式碼

40. n40BuildersHowItWorks

答案:
1:c,td是一個方法,這裡的td顯然是在呼叫
2:b,color是引數名,這裡使用了命名引數
3:b,這裡是個lambda表示式
4:c,this指向呼叫者

相關文章