Scala 仅在有限的时间内为变量赋值

Scala 仅在有限的时间内为变量赋值,scala,Scala,假设有一个布尔变量,最初赋值为false。有没有办法说,让这个变量在接下来的5分钟内保持true,然后再保持false 我目前的想法是,我可以将变量与时间戳一起存储,然后一旦变量变为true,时间戳就设置为当前时间,然后,通过一种方法检查变量的值,如果当前时间和初始时间戳的持续时间小于5分钟,则返回true,如果持续时间大于5分钟,则返回false。我正在考虑从Boolean到RichBoolean的隐式转换,它将通过一个优雅的方法名或其他什么来处理这个机制 有没有一种更优雅的或Scala原生的

假设有一个布尔变量,最初赋值为
false
。有没有办法说,让这个变量在接下来的5分钟内保持
true
,然后再保持
false

我目前的想法是,我可以将变量与时间戳一起存储,然后一旦变量变为
true
,时间戳就设置为当前时间,然后,通过一种方法检查变量的值,如果当前时间和初始时间戳的持续时间小于5分钟,则返回
true
,如果持续时间大于5分钟,则返回
false
。我正在考虑从
Boolean
RichBoolean
的隐式转换,它将通过一个优雅的方法名或其他什么来处理这个机制


有没有一种更优雅的或Scala原生的方法来实现这一点?

您是否愿意为此使用包装器对象?像TimedBoolean?如果是这样的话,那么你可以直接用定时器做一些事情,或者只是在getter和setter上做一个时间戳检查


直接回答你的问题,不,没有Scala原生的方法。但是我认为包装器方法是您正在寻找的“更优雅”的方法。

时间戳的思想非常容易实现(这里的参数以秒为单位):

类瞬时真(持续时间:双倍){
private[this]val createdAt=System.nanoTime

def值=(System.nanoTime createdAt)*1e-9你可以通过期货更优雅地完成你想要的。你不会有一个适当的变量改变它的值,但不清楚这是否是你问题中的绝对要求,你会有一个方法在一定时间后开始返回不同的值。例如,使用:


现在,
t.isDone
将在十秒钟内为假,然后为真。这种方法的好处是,未来会有很多其他组合器,可以让你更直接地解决问题。查看更多信息。

是的,因此它显然不会变得“优雅”。无论如何,谢谢。我总是想知道为什么有人会默认使用纳米时间,而不是毫秒,尤其是考虑到这一点,而且对人类来说更难。选择纳米时间的原因是什么?纳米时间使用高分辨率的日期/时间独立时钟。currentTimeMillis使用系统时钟-因此,如果有人重置日期,您的计时往往会出错。当然,请注意,您也可以让您的未来在完成时更改
var
的值,但我觉得必须有更好的方法来解决您的问题。
class TransientlyTrue(duration: Double) {
  private[this] val createdAt = System.nanoTime
  def value = (System.nanoTime-createdAt)*1e-9 <= duration
}
implicit def TransientToBoolean(t: TransientlyTrue) = t.value
import com.twitter.util._
import com.twitter.conversions.time._

implicit val timer = new JavaTimer

val t = Future.sleep(10.seconds)