Можно ли выразить kotlin 'с' эквивалентом метода в Scala?

Kotlin Standard lib содержит метод 'with', который получает объект и метод этого объекта, который определяется как:

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.

Однако import Scala достаточно общий, чтобы вы могли использовать его вместо него . Ваш пример будет писать как:

 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 

Обратите внимание, что пустая строка необходима, иначе она будет проанализирована как попытка вызвать метод apply на "string" с аргументом {...} качестве аргумента. Чтобы избежать этой проблемы, вы можете использовать locally метод:

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

само по себе ничего не делает; он используется только для визуального выделения того, что фигурные скобки существуют только по причинам, связанным с определением области видимости, и по расширению, чтобы помочь разборчивости делать правильные вещи.