println()产生不同的输出

时间:2018-08-04 14:59:21

标签: kotlin string-interpolation

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

} 

我很困惑,为什么上面的代码会产生不同的输出

3 个答案:

答案 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]")