2015-03-28 8 views
0

Я пытаюсь написать класс, когда при вызове функции, определенной в классе, он будет хранить его в массиве функций, а не сразу же выполнять его, а затем вызывает exec() выполнить его:Задержка Выполнение ряда операций

class TestA(val a: Int, newAction: Option[ArrayBuffer[(Int) => Int]]) { 
    val action: ArrayBuffer[(Int) => Int] = if (newAction.isEmpty) ArrayBuffer.empty[(Int) => Int] else newAction.get 
    def add(b: Int): TestA = {action += (a => a + b); new TestA(a, Some(action))} 

    def exec(): Int = { 
    var result = 0 
    action.foreach(r => result += r.apply(a)) 
    result 
    } 

    def this(a:Int) = this(a, None) 
} 

Тогда это мой тестовый код:

"delayed action" should "delay action till ready" in { 
    val test = new TestA(3) 
    val result = test.add(5).add(5) 
    println(result.exec()) 
    } 

Это дает мне результат 16, так как 3 был принят в два раза и был добавлен в два раза. Я думаю, что простой способ решить эту проблему - не передать значение для второго раунда, например, изменить val a: Int на val a: Option[Int]. Это помогает, но это не решает мою настоящую проблему: пусть вторая функция знает результат первого выполнения.

У кого-нибудь есть лучшее решение? Или, если это шаблон, может ли кто-нибудь поделиться с ним учебником?

ответ

1

Просто сохраните результат действия в переменной «результат» (instatiate его с «а») и использовать предыдущий результат в качестве входных данных для текущей итерации

def exec(): Int = { 
    var result = a 
    action.foreach(r => result = r.apply(result)) 
    result 
} 

или использовать более функциональное ориентированное решение что делает то же самое

def exec(): Int = { 
    action.foldLeft(a)((r, f) => f.apply(r)) 
} 
+0

Да, в конце концов я использовал что-то вроде этого. –

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