Kotlin 标准库包含 'with' method接收一个对象和该对象的方法定义为:
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中没有办法定义这样的方法,因为function literals with receiver的概念在 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"
上使用{... }
作为参数。为了避免这个问题,你可以使用 locally
方法:
val str = "string"
locally {
import str._
println(length)
println(substring(3))
}
println(length) // does not compile
locally
本身不做任何事情;它仅用于在视觉上突出显示大括号仅出于作用域原因而存在,并通过扩展来帮助解析做正确的事情。
关于scala - 是否可以在 Scala 中表达等效的 kotlin 'with' 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46378386/