调用函数的 Scala 增量计数器

Scala Increment Counter on calling Function

如何在 Scala 中每次调用函数时递增一个函数?我有一个执行一组操作的函数 A,当用户调用函数 A 时,我希望有一个递增的计数器和 returns 计数器值。当我调用它时,下面的代码没有 return 预期的计数器 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
   }

在 Scala 中,val 是不可变对象,不能更改,而 var 是可变对象,可以更改。因此,您可以使用 var 并执行 count = count + 1 来完成这项工作。尽管代码的其余部分非常可疑,而且我希望这只是您正在玩的玩具……但这是一个直接的答案。

这段代码的编写方式无法正常工作 - 您的计数器在函数内部,并且在每次函数调用时都会创建和处理,因此它始终 return 常量值。

您需要在函数块外定义计数器

  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()
        }
    }
    

count 是一个 AtomicInteger,用于处理并发访问。

  1. 另一个选择,更 Scala 的方式,是有一个 Actor,它会为你处理计数,有 2 个命令 increase 和 get。

还有很多其他的。