使用类中的几个函数实现扩展函数Kotlin
我在理解如何实现扩展函数时遇到问题,该函数调用类内的其他函数。我的目标是实现在这种情况下调用的扩展函数 open(),find()并且close().
Fridge 类如下:
class Fridge {
fun open() = println(1)
fun find(productName: String): Product {
println(productName)
return 4
}
fun close() = println(3)
}
我对编写单个扩展函数没有问题,可以说:
fun Double.addInt(i: Int) = this + i.toDouble()
但是我同时对多个函数感到困惑,指定的返回类型也让我感到困惑。我所拥有的是:
fun Fridge.take(productName: String): Product {
open()
find(productName)
close()
//return this.find(productName)
}
我在哪里犯了错误?现在我猜它是返回类型,但是如何返回Product?
(这是来自 的任务hyperskill)
回答
传统的答案是将结果存储在一个临时变量中,以便稍后返回它:
fun Fridge.take(productName: String): Product {
open()
val result = find(productName)
close()
return result
}
Kotlin 还提供了一个较短的替代方案,您可能会发现或多或少清楚:
fun Fridge.take(productName: String): Product {
open()
return find(productName)
.also{ close() }
}
这使用了also()作用域函数,它只返回调用它的对象(在本例中,是我们要返回的产品)。?(我已经将它用于简单的情况,例如日志记录;但我认为对于更复杂的事情可能会造成混淆。)
稍后更新:
我在上面的代码中遗漏了一个很大的安全问题:如果在查找产品时出现问题并find()抛出异常,会发生什么?它将立即退出该方法,让冰箱保持打开状态!
这通常是个坏主意。?就冰箱而言,它可能会导致您的食物变热;在其他程序中,让资源保持打开状态可能会阻止它再次被使用。?解决这个问题的通常方法是使用try...finally块 - 巧合的是,它为原始问题提供了另一个答案:
fun Fridge.take(productName: String): Product {
open()
try {
return find(productName)
} finally {
close()
}
}
这将打开冰箱,并尝试查找并退回产品。?但是,无论发生什么,如果冰箱被打开,它总是会关闭。