「喵先生真的把桌上的玩偶都帶回去了呢。」「是呀,難得可以看到他的桌面。」「難得的是可以看到他天黑前下班吧!」今天我倆慢了喵先生一步,正好聽到其他人的閒談。
「小公司的優點就是關係比較親密呢。」老姐確認過東西都收好後,提包踏出辦公室,我也迅速跟上。
「對了,你昨天用 filter
實作奇數偶數,可不可以改用 step
?還有我試著倒過來用 10..0
結果被 IDE 提醒是空的叫我改用 downTo
,感覺好像被 IDE 嘲笑了⋯⋯。」
for (i in 0..10 step 2) { //偶數
print(i.toString())
}
for (i in 1..10 step 2) { //奇數
print(i.toString())
}
for (i in 9 downTo 1 step 2) { //奇數
print(i.toString())
}
「那是因為 ..
其實是 operator
rangeTo 的縮寫啦,所以還是得符合 rangeTo 函式的規則,結束數字要大於開始數字。就像字串相加的可以直接用 +
但其實是用到 operator
plus 」
0..10 // 0.rangeTo(10)
「另外,迴圈那個有點不一樣唷,實際測試會發現:有 step
的會是 IntProgression
,沒有 step
的話會是 IntRange
, downTo
也是 step
的應用,而 kotlin SDK IntProgression
沒有實作 Extension
random 。」
「不過有趣的是經過 filter 後之後產生的結果有實作 random 」。
「當然也可以自己實作 Extension
,比如偷偷塞一個 filter 在裡面。」
//寫在最外層
private fun IntProgression.random(): Int { //格式就是 fun {被擴充的對象}.{擴充名}: 回傳值
return this.filter { true }.random()
}
老姐驚呼:「哇,真好!之前沒有 Extension
的時候,都是寫成參數函式引用,要用的時候不只需要記得函式名和存在哪個檔案,而且管理上也超不方便,說不定團隊裡早有人寫好但我們不知道。」
private fun random(intProgression: IntProgression): Int { //黑暗時代的寫法
return intProgression.filter { true }.random()
}
「重點是除了函式,連屬性都可以 Extension
!」我乘勝追擊。
fun Application.module(testing: Boolean = false) {
install(ContentNegotiation) {
gson {
}
}
routing {
get("/api/cat") {
call.respond(mapOf("message" to (0..10 step 2).firstCat))
}
}
}
//寫在最外層
val IntProgression.firstCat: String
get() = first.toString() + "Cat"
老姐放聲大笑:「哈哈哈,這個妙,明天把 Extension
部分遮住,就可以和喵先生吹牛說現在程式碼連貓咪屬性都有了。」
本次鐵人賽的作品在放進更多內容後已經成書,書名是《老姐要用Kotlin寫專案:從 Server 到 Android APP 的開發生存日記》,歡迎購買唷。https://www.tenlong.com.tw/products/9789864348978