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
само по себе ничего не делает; он используется только для визуального выделения того, что фигурные скобки существуют только по причинам, связанным с определением области видимости, и по расширению, чтобы помочь разборчивости делать правильные вещи.