加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:42:08 所属栏目:安全 来源:网络整理
导读:Kotlin Standard lib包含接收对象的 ‘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 "st
Kotlin Standard lib包含接收对象的 ‘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中无法定义这样的方法,因为Scala中不存在 function literals with receiver的概念.

但是,Scala的导入足够通用,您可以使用它而不是使用它.您的示例将写为:

val str = "string"
import str._
println(length)
println(substring(3))

请注意,大小特别适用于此方案,因为它恰好隐藏在String上,所以我不得不使用长度.但是,一般来说,这是我们使用的模式.

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

val str = "string"

{
  import str._
  println(length)
  println(substring(3))
}
println(length) // does not compile

请注意,空白行是必需的,否则它将被解析为尝试使用{…}作为参数调用“string”上的apply方法.要避免此问题,可以使用本地方法:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读