Можно ли выразить 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 

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

Intereting Posts
Как сделать первичный ключ как автоинкремент для Room Persistence lib коллекции kotlin, преобразующие карту в новую карту со значениями, вычисленными из оригинала Почему sumBy (селектор) не возвращает Long? Android Retrofit и GSON: ответ JSON возвращает объект или строку как значение свойства Kotlin: Можете ли вы использовать именованные аргументы для varargs? Запечатанные обобщенные обобщенные классы в котлине, не связанные с внутренними классами Android только setStackFromEnd, только если RecycleView / List больше экрана Валь и Вар в Котлине Нельзя использовать проверку весов с MongoDB Асинхронный вызов для каждого элемента внутри коллекции Формат Строка Котлина с несколькими вхождениями TornadoFX: разрешить копирование элемента из списка в буфер обмена Kotlin thread save native lazy singleton с параметром указать класс Kotlin как точку входа Main-Class в MANIFEST.MF? Kotlin + Mockito: получение нулевого