Scala 表达式按意外顺序打印自身
当我打印这样的日志信息时:Scala 表达式按意外顺序打印自身,scala,Scala,当我打印这样的日志信息时: val idList = getIdList log info s"\n\n-------idList: ${idList foreach println}" val idList = getIdList log info s"\n\n-------idList: ${idList mkString " "}" 它告诉我: 1 2 3 4 5 -------idList: () 这是有道理的,因为foreach返回Unit。但是为什么它要先打印id列表呢空闲列
val idList = getIdList
log info s"\n\n-------idList: ${idList foreach println}"
val idList = getIdList
log info s"\n\n-------idList: ${idList mkString " "}"
它告诉我:
1
2
3
4
5
-------idList: ()
这是有道理的,因为foreach
返回Unit
。但是为什么它要先打印id列表呢<代码>空闲列表已在前一行中计算(如果这是原因)
以及如何使其按预期顺序打印-在
idList:
之后 这是因为您不是通过计算日志字符串来读取所需内容,而是将其计算为:
\n\n -------idList: ()
但是,由于字符串插值中的println
调用,列表的成员作为副作用出现在输出流中。
编辑:由于OP要求澄清,因此,输出来自两个来源:
${idList foreach println}
的计算结果为()
,因为println
本身不返回任何内容println
被调用。和println
将所有元素打印到输出流中//line with log.info() reached, starts evaluating string before method call
1 //println from foreach
2 //println from foreach
3 //println from foreach
4 //println from foreach
5 //println from foreach
//string argument log.info() evaluated from interpolation
-------idList: () //log info prints the resultant string
为了解决您的问题,修改插入字符串中的表达式,以实际返回正确的字符串,例如:
log info s"\n\n-------idList: ${idList.mkString("\n")}"
这是因为您不是通过计算日志字符串来读取所需内容,而是将其计算为:
\n\n -------idList: ()
但是,由于字符串插值中的println
调用,列表的成员作为副作用出现在输出流中。
编辑:由于OP要求澄清,因此,输出来自两个来源:
${idList foreach println}
的计算结果为()
,因为println
本身不返回任何内容println
被调用。和println
将所有元素打印到输出流中//line with log.info() reached, starts evaluating string before method call
1 //println from foreach
2 //println from foreach
3 //println from foreach
4 //println from foreach
5 //println from foreach
//string argument log.info() evaluated from interpolation
-------idList: () //log info prints the resultant string
为了解决您的问题,修改插入字符串中的表达式,以实际返回正确的字符串,例如:
log info s"\n\n-------idList: ${idList.mkString("\n")}"
println是一个打印到标准输出的单位函数,您应该使用mkstring来代替它返回字符串
log info s"\n\n-------idList: ${idList.mkString("(", ", ", ")")}"
println是一个打印到标准输出的单位函数,您应该使用mkstring来代替它返回字符串
log info s"\n\n-------idList: ${idList.mkString("(", ", ", ")")}"
正如@TheTerribleSwiftTomato所指出的,您需要给出一个返回值且没有其他副作用的表达式。因此,只需这样做:
val idList = getIdList
log info s"\n\n-------idList: ${idList foreach println}"
val idList = getIdList
log info s"\n\n-------idList: ${idList mkString " "}"
例如,这对我很有用:
val idList = List(1, 2, 3, 4, 5)
println(s"\n\n-------idList: ${idList mkString " "}")
输出:
-------idList: 1 2 3 4 5
正如@TheTerribleSwiftTomato所指出的,您需要给出一个返回值且没有其他副作用的表达式。因此,只需这样做:
val idList = getIdList
log info s"\n\n-------idList: ${idList foreach println}"
val idList = getIdList
log info s"\n\n-------idList: ${idList mkString " "}"
例如,这对我很有用:
val idList = List(1, 2, 3, 4, 5)
println(s"\n\n-------idList: ${idList mkString " "}")
输出:
-------idList: 1 2 3 4 5
插值的工作方式如下:
插值的工作方式如下:
println是表达式
idList foreach println
的副作用,首先计算${..}部分,因此列表被发送到printlnfirst@Alex,有人解释过吗?println是表达式idList foreach println
的副作用,${..}部分首先计算,所以列表被发送到printlnfirst@Alex,有人解释过吗?要打印字符串,必须首先计算idList foreach println
表达式(当然,它没有值)。在计算println时,为每个元素调用println。然后就可以打印字符串了。@Alex:这正是Kigyo(和我;)所说的。为了子孙后代,对答案进行了补充说明。更好的用法是:log info(1到5)。mkString(“\n--ids\n”,““,”,“\n”)
或类似用法。要打印字符串,必须首先计算idList foreach println
表达式(当然,它没有值)。在计算println时,为每个元素调用println。然后就可以打印字符串了。@Alex:这正是Kigyo(和我;)所说的。为了子孙后代,对答案进行了补充说明。更好的用法:日志信息(1到5).mkString(“\n--ids\n”、“,”、“\n”)
或类似用法。