【问题标题】:Scala Increment Counter on calling Function调用函数时的Scala增量计数器
【发布时间】:2015-02-05 13:55:17
【问题描述】:

每次在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
   }

【问题讨论】:

    标签: function scala counter


    【解决方案1】:

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

    【讨论】:

    • 谢谢@Justin Pihony,是的,这是一个临时代码,我是新手。
    【解决方案2】:

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

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

    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 个命令。

    还有很多其他的。

    【讨论】:

    • 谢谢@mavarazy,你的想法刚刚奏效,虽然我没有使用过 Akka 演员,因为我不熟悉它
    猜你喜欢
    • 2017-08-12
    • 2021-04-03
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2012-05-12
    • 2016-10-29
    相关资源
    最近更新 更多