Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 表达式按意外顺序打印自身_Scala - Fatal编程技术网

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”)
    或类似用法。