字符串模板中无法识别Kotlin扩展属性

时间:2016-11-24 11:45:05

标签: kotlin

我已经开始尝试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

2 个答案:

答案 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()结果。