【Kotlin填坑-02】使用高階函數後的when語句
閱讀本文大約還不需要2.33分鐘,而且一大半是引用
源:Kotlin雜談(二) - 以DSL重新打造when
用了Kotlin一段時間了,很多特性用起來很爽很舒服,但有一點總是如鯁在喉,那就是when的一些問題了
大概意思就是說when語句可以但是缺少自身的引用,沒法寫像下面的,然後it好像沒法用?
when (1) {n > 5 -> print("Fuck") //這有問題了...n}n
然後前幾天突然想到Kotlin有幾個高階函數可以像let,apply什麼的,好像可以用到。
看了後發現用let可以達到一些目的
Kotlin之let,apply,with,run函數區別 - CSDN博客
這裡我們直接用let這個擴展函數來搞事情。
因為let可以在下面代碼塊中使用it作為當前對象來做一些**的事情。
val number = 23333n number.let {n when {nit > 5 -> println("it gt 5")nit < 5 -> println("it lt 5")n }n }n
我們可以來看一下let的定義
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)n
首先let()的定義是這樣的,默認當前這個對象作為閉包的it參數,返回值是函數裡面最後一行,或者指定return
所以這樣的話在when裡面用it就沒問題了。
畢竟泛型+擴展,所以寫成這樣是可以的。
23333.let{n when{nit > 5 -> println("it gt 5")nit < 5 -> println("it lt 5")n }n }n
(評論區的辯論很精彩,大概意思是這是一個偽需求,然後我接著又創建了偽需求。。字面量要啥賦值判斷啊,如果單純靠上面的number變數在when裡面直接比較number>5也是可以的。
不過作為it愛好者協會的我來說,當然是能用it的地方堅決用it啦。這樣會不會誤人子弟……)
但是感覺上面的那種寫法也很膈應人。我要寫一個let再來一個when……太鬼true了
我還想直接寫成像這樣的。
number.whenLet {n it > 5 -> println("it gt 5")n it < 5 -> println("it lt 5")n }n
但是由於when語句好像必須寫成(Boolean->返回值)的形式,不能通過參數形式的(Boolean->返回值),所以暫時沒法實現我的想法。
嗯。最後……
借用 @FGO 輝夜 的話
奈何我想不到如何寫...等哪天我找到方法能寫成when一樣的話,我再寫一篇文章分享出來
有生之年系列,萬一哪天Kotlin更新了呢……(逃
推薦閱讀: