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

标签 scala kotlin higher-order-functions

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/

相关文章:

Scala 相当于 Haskell 的 where 子句?

scala - 我可以将这个异步Java网络API转换成Monadic表示形式(或其他惯用的表示形式)吗?

gradle - 如何使用 Gradle Kotlin DSL 运行 kotlintest 测试?

javascript - 返回函数 - 的函数?

scala - elastic4s中找不到HttpClient?

scala - 可以使 scala 需要一个非 Nothing 泛型方法参数并返回类型安全

kotlin - 使用 kotlin dsl 修改 buildSrc 中 gradle 插件中的任务

list - 如何从非流函数获取流输出

list - 扫描仪如何工作? haskell

javascript - 简单来说,thunk 和高阶函数有什么区别?