访问包装函数中的实例
在Kotlin中,我有这个函数来包装一个事务:
fun wrapInTransaction(code: () -> Unit) { realmInstance.beginTransaction(); code.invoke() realmInstance.commitTransaction(); }
我怎样才能访问realmInstance
在被调用的代码?
其他答案正确地演示了如何将RealmInstance
对象传递给lambda。 另外,你可以使整个功能成为一个扩展功能,使呼叫站点更漂亮:
fun Realm.wrapInTransaction(code: Realm.() -> Unit) { //this is implicit beginTransaction(); code() commitTransaction(); }
通话网站将如下所示:
Realm.getInstance(this).wrapInTransaction { createObject(User.class) }
这里简单的解决方案是使接收器的 code
功能 :
fun wrapInTransaction(code: Realm.() -> Unit) { realmInstance.beginTransaction(); realmInstance.code() realmInstance.commitTransaction(); }
在你作为code
传递的lambda里面,你将能够使用this
引用RealmInstance
并直接使用它的成员,就像在一个成员函数里面一样。
调用realmInstance.code()
只是调用code
与传递realmInstance
作为接收器。
将wrapInTransaction
函数更改为接受wrapInTransaction
上的扩展方法, realmInstance
所示:
fun wrapInTransaction(code:Realm.() -> Unit){ realmInstance.beginTransaction(); realmInstance.code() realmInstance.commitTransaction(); }
那么你可以像这样使用它:
wrapInTransaction { println("realm instance is $this, instanceId: $instanceId") }
为了示例的目的, Realm
看起来像:
class Realm { val instanceId = 42 fun beginTransaction() { } fun commitTransaction() { } }
上面的技术是可能的,这要归功于Kotlin的函数接收函数 ,使得可以在lambda函数体内设置 this
实例(接收器)。 它可以轻松构建重新组装Groovy或Ruby的类型安全构建器。
这个答案提供了更多的技术样本。