gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:44:07 28 4
gpt4 key购买 nike

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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com