访问包装函数中的实例

在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的类型安全构建器。

这个答案提供了更多的技术样本。