你能打破这种奇怪的语法吗?

时间:2017-11-22 00:41:31

标签: scala

下面的代码打印圆圈的面积和周长,但我不知道它是如何工作的。我熟悉那里使用的基础知识,例如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)
}

2 个答案:

答案 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