是否可以在 Scala 中表达等效的 kotlin 'with'方法?



>Kotlin 标准库包含接收对象的"with"方法和定义为:

public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

并可用作:

val str = "string"
with(str) {
println(size)) // will print 6; equals to "string".size
println(substring(3)) // will print (ing); equals to "string".substring(3)
}

如何在 Scala 中定义类似的方法?

在 Scala 中没有办法定义这样的方法,因为 Scala 中不存在带有接收器的函数文字的概念。

但是,Scala 的import足够通用,您可以使用它而不是with.您的示例将写为:

val str = "string"
import str._
println(length)
println(substring(3))

请注意,size特别不适用于此方案,因为它恰好在String上隐式拉皮条,所以我不得不改用length。但是,一般来说,这是我们使用的模式。

注释后编辑:如果要将导入范围显式限定为代码的一部分,可以使用大括号来实现,大括号始终允许限定范围

val str = "string"
{
import str._
println(length)
println(substring(3))
}
println(length) // does not compile

请注意,空行是必需的,否则它将被解析为尝试在"string"上调用apply方法,并将{...}作为参数。若要避免此问题,可以使用locally方法:

val str = "string"
locally {
import str._
println(length)
println(substring(3))
}
println(length) // does not compile

locally本身不做任何事情;它仅用于在视觉上突出显示大括号只是出于范围原因,并扩展以帮助解析做正确的事情。

最新更新