gpt4 book ai didi

Scala:具有多个代码块的自定义控制结构

转载 作者:行者123 更新时间:2023-12-04 13:04:51 25 4
gpt4 key购买 nike

是否可以以 before { block1 } then { block2 } finally { block3 } 的方式创建具有多个代码块的自定义控制结构? ?问题仅与糖部分有关 - 我知道通过将三个 block 传递给方法可以轻松实现该功能,例如 doInSequence(block1, block2, block3) .

一个真实的例子。对于我的测试实用程序,我想创建一个这样的结构:

getTime(1000) {
// Stuff I want to repeat 1000 times.
} after { (n, t) =>
println("Average time: " + t / n)
}

编辑 :

最后我想出了这个解决方案:
object MyTimer {
def getTime(count: Int)(action : => Unit): MyTimer = {
val start = System.currentTimeMillis()
for(i <- 1 to count) { action }
val time = System.currentTimeMillis() - start
new MyTimer(count, time)
}
}

class MyTimer(val count: Int, val time: Long) {
def after(action: (Int, Long) => Unit) = {
action(count, time)
}
}

// Test
import MyTimer._

var i = 1
getTime(100) {
println(i)
i += 1
Thread.sleep(10)
} after { (n, t) =>
println("Average time: " + t.toDouble / n)
}

输出是:
1
2
3
...
99
100
Average time: 10.23

它主要基于 的回答托马斯洛克尼 ,我只是添加了伴生对象才能 import MyTimer._
谢谢大家,伙计们。

最佳答案

一般原则。您当然也可以使用 f 参数。 (请注意,此示例中的方法名称没有意义。)

scala> class Foo {
| def before(f: => Unit) = { f; this }
| def then(f: => Unit) = { f; this }
| def after(f: => Unit) = { f; this }
| }
defined class Foo

scala> object Foo { def apply() = new Foo }
defined module Foo

scala> Foo() before { println("before...") } then {
| println("then...") } after {
| println("after...") }
before...
then...
after...
res12: Foo = Foo@1f16e6e

关于Scala:具有多个代码块的自定义控制结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4573587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com