Итак, я новичок в программировании на Kotlin, и во время изучения руководств я наткнулся на тему функций расширения. В учебнике был представлен пример объединения трех строк одновременно с использованием функции расширения (скажем, tripcon) следующим образом:
fun main() {
val str1 = "Three "
val str2 = "concantenated "
var str3 = "strings."
str3 = str3.tripcon(str1,str2)
println(str3)
}
fun String.tripcon(s1: String, s2: String) : String{
return s1 + s2 + this
}
Приведенный выше код даст правильный вывод как
Three concatenated strings.
Однако, если я изменю функцию tripcon() следующим образом:
fun String.tripcon(s1: String, s2: String){
this= s1+s2+this
}
И впоследствии измените предпоследнюю строку в функции main() следующим образом:
str3.tripcon(str1,str2)
Выдает ошибку с указанием Ожидается переменная в строке:
this= s1+s2+this
Итак, мой вопрос: возможно ли, чтобы объект, вызвавший функцию расширения, был изменен внутри него? Или есть другие альтернативы? Спасибо!
Строки неизменяемы. Вы никогда не сможете изменить строку внутри функции расширения или иным образом.
Даже если бы вы могли, вы бы не присвоили новое значение this
. this
— это объект, поведение которого вы расширяете. Тогда вы не будете изменять этот объект, а попытаетесь «заменить» его или что-то в этом роде. Честно говоря, я понятия не имел, к чему бы это привело, если бы Котлин позволил вам это сделать. Но это не так. Если бы String не была неизменной, вы бы хотели сделать что-то вроде this.setValue(s1 + s2 + this)
str3 = str3.tripcon(str1,str2)
работает, потому что tripcon
создает новую строку, а затем вы присваиваете эту новую строку ссылке str3
.
Ип У тебя получилось!
Ах, я понимаю! Все, что находится внутри двойных кавычек, является константой, следовательно, неизменной. И когда я назначаю str3 = str3.tripcon(str1,str2), ссылочная переменная str3 просто «указывает» на другой объект String, имеющий значение str1+str2+ «строки».