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

时间:2014-05-29 22:14:32

标签: scala

让我们说有一个布尔变量,最初赋值为false。有没有办法说,让这个变量在接下来的5分钟内变为true,然后让它再次成为false

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

是否有更优雅或Scala原生的方式来做这件事?

3 个答案:

答案 0 :(得分:5)

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

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

通过隐式转换,您可以透明地将其放在需要Boolean的任何位置。或者您可以将其关闭,只需致电.value

答案 1 :(得分:5)

你可以用期货更优雅地完成你想要的东西。你不会有一个正在改变其值的变量,但是不清楚这是你问题中的绝对要求,并且你将有一个方法在一定时间后开始返回一个不同的值。例如,使用Twitter's implementation

import com.twitter.util._
import com.twitter.conversions.time._

implicit val timer = new JavaTimer

val t = Future.sleep(10.seconds)

现在t.isDone将为假,持续十秒,然后为真。这种方法的好处在于,您可以在未来获得许多其他组合器,这可以让您更直接地解决问题 - 请参阅the Scala documentation以获取更多信息。

答案 2 :(得分:-1)

你可以使用这个包装器对象吗?像TimedBoolean?如果是这样,那么你可以用一个Timer直接做一些事情,或者只是在你的getter和setter做一个时间戳检查..

直接回答您的问题,不,不,Scala本地方式不会这样做。但我认为包装方法是你寻找的“更优雅”的方式。