带有接收器的函数的 Kotlin 扩展函数
Kotlin extension function of a function with receiver
我正在玩 Kotlin 的扩展函数。
我想为带有接收器的布尔返回函数创建一个扩展函数,returns 补码函数。
我的目标是能够写作:
val isEven: Int.() -> Boolean = { this % 2 == 0 }
val isOdd: Int.() -> Boolean = isEven.complement()
我确实意识到有更好、更清晰的方法来做我正在做的事情,我想更好地理解这里的语言本身,所以请不要告诉我把 isOdd
写成 { !isEven() }
:)
我想要这样的东西:
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = TODO()
现在,
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = this
编译正确,所以这里的语法绝对有意义。问题是 this
是 I.() -> Boolean
类型,我需要使用接收器访问我的函数的 "inner receiver",比如 this@this
,这样写:
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = { !(this@this).this() }
其中 this@this
的类型为 I
。有什么办法可以达到这个效果吗?
此外,我注意到我不知道如何使用接收器调用函数,我尝试:
fun <I> (I.() -> Boolean).complement(innerthis: I): I.() -> Boolean = { !this(innerthis) }
我得到一个 error: expression 'this' of type 'I' cannot be invoked as a function. The function 'invoke()' is not found
.
这听起来不对! this
的类型应该是 I.() -> Boolean
,而不是 I
!我无法理解这个错误消息。
我想也许我只是使用了错误的语法,所以我改为:
fun <I> (I.() -> Boolean).complement(innerthis: I): I.() -> Boolean = { !innerthis.this() }
但我得到了同样的错误。这让我非常困惑,正如我所期望的 innerthis
类型 I
和 this
类型 I.() -> Boolean
。
= this
的实现似乎证实了我的期望,可以完美地编译。
有人可以向我解释编译器引发的错误吗?
谢谢!
您可以通过函数名称来消除外部 this
的歧义:
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = { !this@complement(this) }
这里this@complement
是complement
函数的接收者,plainthis
是lambda函数字面量的接收者。为简单起见,this@complement
的调用方式类似于带有一个参数的函数,但是也可以使用更棘手的语法将其作为扩展函数调用:
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = { !this.(this@complement)() }
我正在玩 Kotlin 的扩展函数。 我想为带有接收器的布尔返回函数创建一个扩展函数,returns 补码函数。
我的目标是能够写作:
val isEven: Int.() -> Boolean = { this % 2 == 0 }
val isOdd: Int.() -> Boolean = isEven.complement()
我确实意识到有更好、更清晰的方法来做我正在做的事情,我想更好地理解这里的语言本身,所以请不要告诉我把 isOdd
写成 { !isEven() }
:)
我想要这样的东西:
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = TODO()
现在,
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = this
编译正确,所以这里的语法绝对有意义。问题是 this
是 I.() -> Boolean
类型,我需要使用接收器访问我的函数的 "inner receiver",比如 this@this
,这样写:
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = { !(this@this).this() }
其中 this@this
的类型为 I
。有什么办法可以达到这个效果吗?
此外,我注意到我不知道如何使用接收器调用函数,我尝试:
fun <I> (I.() -> Boolean).complement(innerthis: I): I.() -> Boolean = { !this(innerthis) }
我得到一个 error: expression 'this' of type 'I' cannot be invoked as a function. The function 'invoke()' is not found
.
这听起来不对! this
的类型应该是 I.() -> Boolean
,而不是 I
!我无法理解这个错误消息。
我想也许我只是使用了错误的语法,所以我改为:
fun <I> (I.() -> Boolean).complement(innerthis: I): I.() -> Boolean = { !innerthis.this() }
但我得到了同样的错误。这让我非常困惑,正如我所期望的 innerthis
类型 I
和 this
类型 I.() -> Boolean
。
= this
的实现似乎证实了我的期望,可以完美地编译。
有人可以向我解释编译器引发的错误吗?
谢谢!
您可以通过函数名称来消除外部 this
的歧义:
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = { !this@complement(this) }
这里this@complement
是complement
函数的接收者,plainthis
是lambda函数字面量的接收者。为简单起见,this@complement
的调用方式类似于带有一个参数的函数,但是也可以使用更棘手的语法将其作为扩展函数调用:
fun <I> (I.() -> Boolean).complement(): I.() -> Boolean = { !this.(this@complement)() }