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