首页 > 解决方案 > 有人可以解释这个 Scala 函数的语法吗?

问题描述

def time[R](block: => R): R = {
    val t0 = System.nanoTime()
    val result = block    // call-by-name
    val t1 = System.nanoTime()
    println("Elapsed time: " + (t1 - t0) + "ns")
    result
}

这是我在网上找到的一个函数,用于测量一段代码在 Scala 中执行的时间。我不明白参数列表之前的 [R] 是什么或 R 是什么 - 它只是表示任何数据类型的标识符吗?我对 Scala 比较陌生,因此感谢您提供任何帮助

标签: scala

解决方案


这只是一个类型参数,在 Java 中是<R>,在 Scala 中是[R]


Java中类似的代码是:

public <R> R time(Supplier<R> block) {
    long t0 = System.nanoTime();
    R result = block.get();
    long t1 = System.nanoTime();
    System.out.println("Elapsed time: " + (t1 - t0) + "ns");
    return result;
}

使用它

System.out.println(time(() -> "hello world"));

将打印

Elapsed time: 12345ns
hello world

在 Scala 中,参数类型=> Rpass-by-name,本质上是一个函数。语法的好处是用户不必编写 lambda。

println(time("hello world"))
// or
println(time {
  Thread.sleep(1)
  123
})

需要类型参数R,因为我们希望time函数是通用的。 RString第一个例子中,Int在第二个例子中。


推荐阅读