標籤:

【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更新了呢……(逃

推薦閱讀:

想學編程,朋友說先下載 Linux 玩,下什麼版本好?
按照現在硬體發展的速度,是否還需要高效的代碼?

TAG:Kotlin | 编程 |