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

Pet*_*ter 3 scala

假设有一个布尔变量,最初赋值false.有没有办法说,让这个变量true在接下来的5分钟内然后让它false再次出现?

我目前的想法是我可以将变量与时间戳一起存储,然后一旦变量转到true,时间戳设置为当前时间,然后通过一个方法检查变量的值,true如果当前时间和初始时间戳形成持续时间小于5分钟,然后false持续时间大于5分钟.我正在考虑从一个隐式转换Boolean到一个RichBoolean通过一个优雅的方法名称来处理这个机制的东西.

是否有更优雅或Scala本地方式这样做?

Rex*_*err 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
Run Code Online (Sandbox Code Playgroud)

通过隐式转换,您可以透明地将其丢弃到您需要的任何位置Boolean.或者你可以把它关掉然后打电话.value.

  • 我总是想知道为什么有人默认为nanoTime,而不是毫秒,特别是考虑到[纳米可能不够准确](http://stackoverflow.com/q/11452597/298389)并且对人类来说更难.这种选择背后的原因是什么? (4认同)
  • nanoTime使用高分辨率的日期/时间独立时钟.currentTimeMillis使用系统时钟 - 所以如果有人重置日期,你的时间往往会搞砸. (3认同)

Tra*_*own 5

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

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

implicit val timer = new JavaTimer

val t = Future.sleep(10.seconds)
Run Code Online (Sandbox Code Playgroud)

现在t.isDone将是假的十秒然后是真的.这种方法的好处在于,您将来可以获得许多其他组合器,可以让您更直接地解决问题 - 有关详细信息,请参阅Scala文档.