Scala println在输出中添加括号
我在scala中迈出了第一步,下面是一个类似“hello world”的代码: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
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
中找到引擎盖下发生的事情