我已经开始尝试kotlin并且出现了一个问题 我已经声明了一个可变列表的扩展属性,并尝试以这种方式在字符串模板中使用它:
fun main(args: Array<String>) {
val list = mutableListOf(1,2,3)
// here if use String template the property does not work, list itself is printed
println("the last index is $list.lastIndex")
// but this works - calling method
println("the last element is ${list.last()}")
// This way also works, so the extension property works correct
println("the last index is " +list.lastIndex)
}
val <T> List<T>.lastIndex: Int
get() = size - 1
我得到了以下输出
the last index is [1, 2, 3].lastIndex
the last element is 3
the last index is 2
第一个println的输出预计与第三个println的输出相同。我已经尝试在模板中获取列表的最后一个元素并且它工作正常(第二个输出),那么在使用扩展属性时是错误还是我遗漏了什么?
我正在使用kotlin 1.0.5
答案 0 :(得分:5)
您需要将模板属性包装成花括号,就像使用list.last()
一样。
println("the last index is ${list.lastIndex}")
如果没有花括号,它只会将list
识别为模板属性。
答案 1 :(得分:4)
Kotlin编译器需要以某种方式解释string
以构建StringBuilder
expression。由于您使用.
,表达式需要包含在${..}
中,以便编译器知道如何解释它:
println("the last index is ${list.lastIndex}") // the last index is 5
表达式:
println("the last index is $list.lastIndex")
相当于
println("the last index is ${list}.lastIndex")
因此,您在控制台中看到list.toString()
结果。