Я пытаюсь написать класс, когда при вызове функции, определенной в классе, он будет хранить его в массиве функций, а не сразу же выполнять его, а затем вызывает 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]
. Это помогает, но это не решает мою настоящую проблему: пусть вторая функция знает результат первого выполнения.
У кого-нибудь есть лучшее решение? Или, если это шаблон, может ли кто-нибудь поделиться с ним учебником?
Да, в конце концов я использовал что-то вроде этого. –