fun main(args: Array<String>) {
var _array = arrayOf(1 , 2 , 3.14 , 'A', "item" , "a b c d", 4)
println("$_array[3]") // [Ljava.lang.Object;@1b6d3586[3]
println("${_array[3]}") // A
println(_array[3]) // A
println( _array[3] + " is _array's item") // ERROR
println( "" + _array[3] + " is _array's item") // A is _array's item
}
我很困惑,为什么上面的代码会产生不同的输出
答案 0 :(得分:5)
println("$_array[3]") // [Ljava.lang.Object;@1b6d3586[3]
打印_array
对象引用,后跟[3]
,您仅将字符串插值用于_array
参数
println("${_array[3]}") // A
打印_array
的第4个元素,对_array[3]
参数使用字符串插值
println(_array[3]) // A
打印_array
的第四个元素(与上面相同)
println( _array[3].toString() + " is _array's item") // ERROR
需要打印toString()
,因为_array
的元素类型为Any
,其后的+号没有定论
它打印_array的第四个元素
println( "" + _array[3] + " is _array's item") // A is _array's item
它不需要toString()
,因为它前面有一个空字符串,编译器将+符号解释为字符串连接,因此它打印_array
的第4个元素
答案 1 :(得分:3)
让我们一一破解:
println("$_array[3]")
与println("${_array}[3]")
相同-[3]在这里只是一个字符串,没有插值
println("${_array[3]}")
对整个_array[3]
进行插值
println(_array[3])
与println(_array[3].toString())
println( _array[3] + " is _array's item") // ERROR
您的数组为Array<Any>
。 plus()
未为(Any,String)定义
println( "" + _array[3] + " is _array's item") // A is _array's item
plus()
是为对(String,Any)定义的,它返回一个字符串
答案 2 :(得分:3)
在字符串模板中使用复杂表达式时,必须将其包装在花括号中。但这对于单个变量是可选的。
所以,这一行
println("$_array[3]")
表示与
相同println(_array.toString() + "[3]")