如何在“运行”或“应用”中包含实现参考
class MyClass : MyCallback {
...
fun myMethod() {
val myObject = MyObject()
myObject.run {
setCallback(this) // <-- How to have the MyCallback's reference here?
}
}
override fun onMyCallback() {
// Do something
}
}
答案 0 :(得分:3)
由于run
是在给run
的块中带有接收者(kotlin reference)的lambda函数,this
指的是接收者,即在您的示例myObject
中。
因此,您需要使用qualified this表达式来引用封闭的MyClass
实例。如评论中所述,您需要像这样更改代码:
class MyClass : MyCallback {
...
fun myMethod() {
val myObject = MyObject()
myObject.run {
setCallback(this@MyClass) // <-- qualified this
}
}
override fun onMyCallback() {
// Do something
}
}
如果要避免使用标签,则必须替换run
函数。可能的替代方法是also
,它不是将lambda与接收器一起使用,而是将对象作为参数:
class MyClass : MyCallback {
...
fun myMethod() {
val myObject = MyObject()
myObject.also { obj ->
//lambda without receiver, this refers to the enclosing instance of MyClass
setCallback(this)
}
}
override fun onMyCallback() {
// Do something
}
}
答案 1 :(得分:0)
recke96已经指出了解决该问题的两种方法,但这是另一种方法。只需在lambda之外给this
命名即可。
class MyClass {
fun myMethod() {
val myObject = MyObject()
val callback = this // <--
myObject.run {
setCallback(callback)
}
}
// ...
}
或者,使用let
class MyClass {
fun myMethod() {
val myObject = MyObject()
let { callback ->
myObject.run {
setCallback(callback)
}
}
}
// ...
}