让我们说有一个布尔变量,最初赋值为false
。有没有办法说,让这个变量在接下来的5分钟内变为true
,然后让它再次成为false
?
我目前的想法是我可以将变量与时间戳一起存储,然后一旦变量转到true
,时间戳就会设置为当前时间,然后检查变量' s如果当前时间和初始时间戳形成持续时间小于5分钟,则返回true
的值,如果持续时间大于5分钟则返回false
。我正在思考从Boolean
到RichBoolean
的隐式转换,它会通过优雅的方法名称来处理这种机制。
是否有更优雅或Scala原生的方式来做这件事?
答案 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本地方式不会这样做。但我认为包装方法是你寻找的“更优雅”的方式。