Function 调用函数时的Scala增量计数器

Function 调用函数时的Scala增量计数器,function,scala,counter,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,

如何在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
   }

在Scala中,
val
是一个不可变的对象,不能更改,
var
是一个可以更改的可变对象。因此,您可以通过使用
var
并执行
count=count+1
来实现这一点。虽然代码的其余部分是高度可疑的,我希望这只是一个玩具,你正在玩…但这是一个直接的答案

按照编写此代码的方式,它无法正常工作-您的计数器位于函数中,每次函数调用时都会创建和释放get,因此它总是返回常量值

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

  • 一种可能的方法是使用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是一个原子整数,用于处理并发访问

  • 另一个选择,更多的Scala方式,是使用两个命令increase和get,让一个参与者为您处理计数

  • 和其他许多人。

    谢谢@Justin Pihony,是的,这是一个临时代码,我是一个新手。谢谢@mavarazy你的想法刚刚奏效,尽管我没有使用Akka演员,因为我不熟悉它