2015-02-04 2 views
1

Как увеличить функцию каждый раз, когда ее вызывали в scala? У меня есть функция A, которая выполняет набор действий, когда пользователь вызывает функцию A, я хотел бы иметь счетчик, который увеличивает и возвращает значение счетчика. Следующий код не возвращает ожидаемый счетчик 1, когда я его вызываю.Scala Increment Counter при вызове Функция

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 
    } 

ответ

0

В Scala, A val непреложный объекта и не может быть изменен, в то время как var является переменной объект, который может изменить. Итак, вы можете сделать эту работу, используя var и делая count = count + 1. Хотя остальная часть кода очень подозрительна, и я надеюсь, что это просто игрушка, с которой вы играете ... но это прямой ответ.

+0

Спасибо @ Justin Pihony, Да, это код нуля, я новичок. – Automator

1

Как этот код написан, он не будет работать правильно - ваш счетчик находится внутри функции, и 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() 
        } 
    } 
    

граф является AtomicInteger, обрабатывать одновременный доступ.

  1. Другой вариант, более Scala способ, состоит в том, чтобы иметь Актера, который будет обрабатывать подсчет для вас, при этом 2 команды увеличиваются и получаются.

И многие другие.

+0

Спасибо @mavarazy, что ваша идея просто сработала, хотя я не использовал акк Акка, так как я не знаком с ней. – Automator

+0

Ты хорошо :) – mavarazy

Смежные вопросы