下面的代码打印圆圈的面积和周长,但我不知道它是如何工作的。我熟悉那里使用的基础知识,例如f“$”,Scanner,nextDouble,但为什么它以((r:Double =>?
开头)你可以帮我分解一下吗?
object Main extends App{
((r:Double) => println(f"${r*r*Math.PI}%.9f ${2*r*Math.PI}%.9f"))(new Scanner(System.in).nextDouble)
}
答案 0 :(得分:2)
我猜这是一个奇怪的语法示例或者代码高尔夫。基本上,它定义了一个函数并在一行中调用。
第一部分
((r:Double) => println(f"${r*r*Math.PI}%.9f ${2*r*Math.PI}%.9f"))
定义函数。语法(args) => body
是“lambda表达式”或“函数文字”,用于定义函数。
第二部分
(new Scanner(System.in).nextDouble)
只是用参数调用函数。这与调用任何其他函数或方法相同,只是不是将函数赋值给名称并使用该名称来调用它,而是直接在函数本身上调用它而不给函数命名。
如果分解为等同的,更明智的代码,可能会更容易理解。
object Main extends App{
def printAreaAndCircumference(r: Double): Unit = {
println(f"${r*r*Math.PI}%.9f ${2*r*Math.PI}%.9f")
}
val radius = new Scanner(System.in).nextDouble
printAreaAndCircumference(radius)
}
答案 1 :(得分:0)
done
只是一个可以简化的功能
((r:Double) => println(f"${r*r*Math.PI}%.9f ${2*r*Math.PI}%.9f"))(new Scanner(System.in).nextDouble)
其中object Main extends App{
val r: Double = new Scanner(System.in).nextDouble
println(f"${r*r*Math.PI}%.9f ${2*r*Math.PI}%.9f")
}
用于将内部使用的变量替换为变量的实际值,即$
。倒置逗号外的r
告诉编译器格式化倒置逗号内使用的表达式,这里是将它格式化为f
个数字的9位小数。并且float
会将读取的值转换为.nextDouble
值。
例如
double
在此val r = new Scanner(System.in).nextLine()
中,读为r
值
String
在此 val r = new Scanner(System.in).nextBigInteger()
中,读为r
值
最后,
Integer
这将打印 val test = "breakdown"
println(s"${test}")
,此处breakdown
用于格式化s
。