【问题标题】:Scala using val as a counterScala 使用 val 作为计数器
【发布时间】:2017-02-27 22:48:47
【问题描述】:

我正在做一个 scala 任务来完成这个:

observeCounter 函数有一个参数 f:一个接受(引用)Counter 实例但不返回任何内容的函数。 observeCounter 函数应该用(引用)一个(扩展 Counter 的类的)对象来调用 f。 扩展 Counter 的类必须跟踪调用递增/递减的总次数。 即,如果在一个实例上调用了 3 次增量方法,并且在同一个实例上调用了 2 次减量方法,那么它应该存储 5(在现有字段 n 之外的某个位置)。 observeCounter 应该调用 f,然后返回 f 在实例上调用递增/递减的总次数。

class myCounter extends Counter {
 val total = 0
 def increment () = {increment(); total = total + 1;}
 def decrement () = {decrement(); total = total + 1;}
 def get() : Int = total 
}


def observeCounter (f : Counter => Unit) : Int = {
 val o1 = new myCounter() 
 f(o1)
 o1.get()
}

其中一个要求是使用 val 而不是 var。我不知道如何做到这一点。有什么建议吗?

【问题讨论】:

  • 递归,兄弟。
  • 问题要求你演示什么知识?因为假设您在 JVM 上,您可以轻松地使用 val total = new java.util.concurrent.atomic.AtomicInteger ,然后使用例如改变它。 AtomicInteger#incrementAndGet.
  • 另请注意,如果使用overridesuper,重继承的代码会更清晰。

标签: scala stateful


【解决方案1】:

我现在看到的最简单的方法是:

class myCounter extends Counter{

  object counter{
    var count = 0
  }

  val total = counter
  def increment () = {super.increment(); total.count+=1}
  def decrement () = {super.decrement(); total.count-=1;}
  def get() : Int = total.count
}

【讨论】:

    【解决方案2】:

    你有两个选择。要么使用持久不可变,其中 f() 返回 Counter 的更新副本,要么使用可变数据结构,使用 var,或者使用变通方法,使用 val 将 var 包装为单个元素数组或一个 AtomicInteger 或类似的东西。

    【讨论】:

    • “你在哪里使用 var”,OP 声明这是不允许的。
    猜你喜欢
    • 2014-10-07
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多