在Scala中可以用“等价的方法”表示kotlin吗?

Kotlin Standard lib包含接收对象的’with’方法以及定义如下对象的方法:

public inline fun  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中不存在函数文字和接收器的概念。

但是,Scala的import是足够普遍的,你可以使用它而不是 。 你的例子会写成:

 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"apply方法。 为了避免这个问题,你可以使用locally方法:

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

locally本身什么都不做; 它仅用于直观地突出显示大括号仅用于范围原因,并且通过扩展来帮助解析做正确的事情。