scala - 有人可以解释这个 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 比较陌生,因此感谢您提供任何帮助
解决方案
这只是一个类型参数,在 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 中,参数类型=> R
是pass-by-name,本质上是一个函数。语法的好处是用户不必编写 lambda。
println(time("hello world"))
// or
println(time {
Thread.sleep(1)
123
})
需要类型参数R
,因为我们希望time
函数是通用的。
R
在String
第一个例子中,Int
在第二个例子中。
推荐阅读
- javascript - 三.js 使用 RectAreaLight 低 fps
- python - 用自定义值替换字符串并迭代所有出现
- android - 如何将 p4a 分发版转换为 apk?
- java - 验证 mongo db 单元模拟单元测试
- apache-kafka - Kafka Streams 应用程序重置工具不删除内部主题
- asp.net-mvc - 如何在回发时将对象保留在视图模型中
- swift - 如何在类中有初始化器但仍然能够访问类的值
- ruby-on-rails - RAILS - 如何允许用户将音乐/Spotify 播放列表添加到他们的个人页面?
- javascript - 为什么 Javascript 中的 instanceof 运算符行为异常?
- c++ - OSError:./testlib.so:未定义符号:_ZN5boost6system15system_categoryEv