是否有可能在Scala中表达kotlin'with'方法?

ped*_*o91 6 scala higher-order-functions kotlin

Kotlin Standard lib包含接收对象的'with'方法和该对象的方法,定义如下:

public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
Run Code Online (Sandbox Code Playgroud)

并可用作:

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)
}
Run Code Online (Sandbox Code Playgroud)

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

sjr*_*jrd 11

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

然而,Scala的import是通用的,以至于你可以用它来代替with.您的示例将写为:

val str = "string"
import str._
println(length)
println(substring(3))
Run Code Online (Sandbox Code Playgroud)

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

注释后编辑:如果要将导入显式限定为代码的一部分,则可以使用大括号来执行此操作,大括号始终允许使用大小写:

val str = "string"

{
  import str._
  println(length)
  println(substring(3))
}
println(length) // does not compile
Run Code Online (Sandbox Code Playgroud)

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

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

locally本身没有做任何事情; 它仅用于在视觉上突出显示大括号仅用于确定范围,并通过扩展来帮助解析做正确的事情.

  • @ pedrorijo91我已经更新了我的答案以解决该问题。 (2认同)