Проблема в том, что все, что вызывается в with
, затеняет внешние функции, потому что введено this
. Та же проблема возникает, если у вас есть класс и функция верхнего уровня с функцией с одинаковой сигнатурой.
Очевидным вариантом было бы просто переименовать его. Кроме того, функция, которая у вас есть, на самом деле не является описательной по сравнению с тем, что она делает на самом деле. Но если вы по какой-то причине не можете переименовать, есть еще другие варианты.
На методы верхнего уровня может ссылаться пакет в Kotlin, например, com.some.package.method
. Он также может быть импортирован как таковой, что является наиболее распространенным способом сделать это. Существует очень мало методов, которые называются com.some.package.method()
.
Kotlin, как и Python, допускает as
в импорте. Это означает, что вы можете сделать это:
package com.example;
// This is the important line; it declares the import with a custom name.
import com.example.append as appendChar; // Just an example name; this could be anything ***except append***. If it's append, it defeats the purpose
fun append(c: Char) {
println("TEST")
}
fun sbTest() = with(StringBuilder()) {
for(c in 'A'..'Z') {
appendChar(c)
}
toString()
}
В качестве альтернативы, как я уже говорил, вы можете добавить пакет:
for(c in 'A'..'Z') {
com.example.append(c)
}
val f = ::append
, конечно, тоже вариант, в любом случае переименовать функцию все же проще, чем создавать импорт с as
или константами, если у вас есть доступ к функции (и что она не принадлежит зависимость).
Если ваш файл находится за пределами пакета, что я не рекомендую вам делать, вы можете просто объявить импорт как:
import append as appendChar