Scala println在输出中添加括号

Scala println在输出中添加括号,scala,Scala,我在scala中迈出了第一步,下面是一个类似“hello world”的代码: package test object Main { def main(args: Array[String]): Unit = { println("Blabla something : " + 3) println("Blabla something : " , 3) } } 以下是我得到的输出: Blabla something : 3 (Blabla somethin

我在scala中迈出了第一步,下面是一个类似“hello world”的代码:

package test
object Main {
def main(args: Array[String]): Unit = {
        println("Blabla something : " + 3)
        println("Blabla something : " , 3)
    }
}
以下是我得到的输出:

Blabla something : 3
(Blabla something : ,3)
为什么第二行有括号,还有“,”? 我期望得到与第一行相同的输出


注意:我尝试搜索scala println括号之类的内容,但我得到的只是关于如何从代码中删除括号的帖子,而不是从输出中删除括号的帖子。

逗号有特殊的含义。由于逗号的存在,编译器正在将
println(“Blabla something:,3)
的参数解释为
元组。特别是,带有
(String,Int)
类型的逗号具有特殊含义。由于逗号的存在,编译器正在将
println(“Blabla something:,3)
的参数解释为
元组。特别是,当您调用

println("Blabla something : " , 3)
发生以下情况:

  • println
    只需要一个参数。此外,在Scala中,可以在没有括号的情况下调用具有一个参数的函数。这意味着
    println
    将其后面的所有内容解释为一个参数,并在其周围添加括号,您的命令将被转换为:

    println((“Blabla某物:”,3))

  • 当指定给
    println
    的参数不是字符串时,通过调用其
    toString
    方法将其转换为字符串,该方法适用于每个对象(以一种或另一种形式)。对于一个元组(在本例中为
    println
    提供的参数),默认的
    toString
    方法只是将元组打印为一对值,并用引号括起来,这正是您所看到的

  • 当你打电话的时候

    println("Blabla something : " , 3)
    
    发生以下情况:

  • println
    只需要一个参数。此外,在Scala中,可以在没有括号的情况下调用具有一个参数的函数。这意味着
    println
    将其后面的所有内容解释为一个参数,并在其周围添加括号,您的命令将被转换为:

    println((“Blabla某物:”,3))

  • 当指定给
    println
    的参数不是字符串时,通过调用其
    toString
    方法将其转换为字符串,该方法适用于每个对象(以一种或另一种形式)。对于一个元组(在本例中为
    println
    提供的参数),默认的
    toString
    方法只是将元组打印为一对值,并用引号括起来,这正是您所看到的


  • 要看到这一点,您可以在REPL中执行以下操作:

    scala> import scala.reflect.runtime.universe.TypeTag
    scala> def printz[T](x: T)(implicit tT: TypeTag[T]) = { val v = x; println(s"$v : $tT")}
    
    scala> printz("Blabla something : " , 3)
    (Blabla something : ,3) : TypeTag[(String, Int)]
    

    TypeTag[(String,Int)]
    提示元组
    (String,Int)

    要查看此操作,可以在REPL中执行类似操作:

    scala> import scala.reflect.runtime.universe.TypeTag
    scala> def printz[T](x: T)(implicit tT: TypeTag[T]) = { val v = x; println(s"$v : $tT")}
    
    scala> printz("Blabla something : " , 3)
    (Blabla something : ,3) : TypeTag[(String, Int)]
    

    TypeTag[(String,Int)]
    提示元组
    (String,Int)

    类似于。这里发生的是“自动转换”(见@LimbSoup的答案)@0_uu我确实怀疑scala的某些功能在这里起作用,但我不知道是哪一个。我会深入研究的,谢谢。类似于。这里发生的是“自动转换”(见@LimbSoup的答案)@0_uu我确实怀疑scala的某些功能在这里起作用,但我不知道是哪一个。谢谢,我将深入探讨这个问题。函数可能永远不会在没有括号的情况下调用,而唯一可以在没有括号的情况下调用的方法是使用中缀符号,这不是这里发生的情况
    println“x”
    是一个语法错误,尽管
    Console println“x”
    可以工作。也就是说,这是对发生的事情的正确描述。@wingedsubmariner我不确定我是否明白。你是说括号是为元组而不是函数添加的吗?(这不是很奇怪吗?@nha Scala不会将
    println(a,b)
    解释为将元组
    (a,b)
    传递给
    println
    ,它将其视为试图将两个参数传递给
    println
    ,发现
    println
    不接受两个参数,而是接受一个元组(它的参数类型是
    Any
    ,它是所有元组类型的超类型),因此将参数包装到元组中,使
    println((a,b))
    。请参阅。@wingedsubmariner好的,我现在明白了。我没有意识到println只使用了一个参数。感谢您的澄清。函数可能永远不会在没有括号的情况下调用,并且只有在没有带中缀符号的括号的情况下才能调用方法,这不是这里发生的事情。
    println“x”
    是一个语法错误,尽管
    控制台println“x”
    有效。也就是说,这是对发生的事情的正确描述。@wingedsubmariner我不确定我是否明白。你是说括号是为元组而不是函数添加的吗?(这难道不奇怪吗?@nha Scala不会解释
    println(a,b)
    将元组
    (a,b)
    传递给
    println
    ,它将其视为试图将两个参数传递给
    println
    ,发现
    println
    不接受两个参数,而是接受一个元组(其参数类型为
    Any
    ,这是所有元组类型的超类型)所以把参数包装成一个元组,使之成为
    println((a,b))
    。看。@wingedsubmariner好的,我现在知道了。我不知道println只取了一个参数。谢谢你的澄清。+1这看起来很酷,你(简单地)会吗解释在
    printz
    函数中发生了什么?TypeTags是一种在运行时具体化类型的方法(),并作为隐式
    tT
    捕获。因此
    printz
    类似于
    println
    ,除了它还打印某种类型的
    T
    (传递给方法的值类型
    x
    )与值
    x
    一起使用。通常不应使用反射。但在这里,它是一种很好的方法,可以在
    println
    中找到引擎盖下发生的事情