调用函数的Scala增量计数器

时间:2015-02-04 21:21:18

标签: function scala counter

如何在每次调用scala时增加一个函数?我有一个函数A执行一组动作,当用户调用函数A时,我希望有一个计数器,它递增并返回计数器值。当我调用它时,下面的代码不会返回1的预期计数器。

def return_id (email_user: String) : Int = {
    Thread.sleep(1000)
    val count = 0
    implicit val conn = ExecuteQuery.getConnection(GENERAL_DB, DB_USER, DB_PASS)
    var idQuery=executeQuery(s"SELECT id FROM Profile WHERE email = '$email_user';")
    idQuery.first()
    val pid=idQuery.getInt("id")
    println(pid)
    if(pid != 0){
     +count = 1
    }
    return count
   }

2 个答案:

答案 0 :(得分:1)

编写此代码的方式,它将无法正常工作 - 您的计数器位于函数内部并且在每个函数调用中创建并处理它,因此它将始终返回常量值。

您需要在功能块之外定义计数器

  1. 一种可行的方法,使用AtomicInteger

    val count = new AtomicInteger()
    
    def return_id (email_user: String) : Int = {
        Thread.sleep(1000)
        implicit val conn = ExecuteQuery.getConnection(GENERAL_DB, DB_USER, DB_PASS)
        var idQuery=executeQuery(s"SELECT id FROM Profile WHERE email = '$email_user';")
        idQuery.first()
        val pid = idQuery.getInt("id")
        println(pid)
        if(pid != 0){
           count.incrementAndGet()
        } else {
           count.get()
        }
    }
    
  2. count 是一个AtomicInteger,用于处理并发访问。

    1. 另一种选择,更多Scala方式,就是拥有一个Actor,它可以处理你的计数,增加2个命令并获得。
    2. 还有很多其他人。

答案 1 :(得分:0)

在Scala中,val是一个不可变对象,无法更改,而var是一个可以更改的变量对象。因此,您可以使用var并执行count = count + 1来完成此工作。虽然其余代码非常可疑,但我希望这只是你玩的玩具......但这是一个直接的答案。