Перебрать список для вызова различных функций - PullRequest
2 голосов
/ 18 июня 2019

У меня есть список целых чисел, нужно перебрать список и вызвать разные функции, которые имеют одинаковые входные параметры, вот мой код:

  def callRandomFunctions(config: config, prefix: String): ChainBuilder = {
    val randomList = Random.shuffle(List(1, 2, 3, 4))
    randomList.foreach { _ =>
      _ match {
        case 1 => func1(config, prefix)
        case 2 => func2(config, prefix)
        case 3 => func3(config, prefix)
        case 4 => func4(config, prefix)
      }
    }
  }

 def func1(config: config, prefix: String): ChainBuilder = {...}
 def func2(config: config, prefix: String): ChainBuilder = {...}
 def func3(config: config, prefix: String): ChainBuilder = {...}
 def func4(config: config, prefix: String): ChainBuilder = {...} 

и получил эти ошибки:

missing parameter type for expanded function
[error] The argument types of an anonymous function must be fully known. (SLS 8.5)
[error] Expected type was: ?
[error]         _ match {
[error]         ^


[error] type mismatch;
[error]  found   : Unit
[error]  required: io.gatling.core.structure.ChainBuilder
[error]     randomList.foreach {
[error]                        ^
[error] two errors found

Ответы [ 4 ]

6 голосов
/ 18 июня 2019

Просто перетасуйте функции и затем вызовите их напрямую.

def func1(config: config, prefix: String): ChainBuilder = ???
def func2(config: config, prefix: String): ChainBuilder = ???
def func3(config: config, prefix: String): ChainBuilder = ???
def func4(config: config, prefix: String): ChainBuilder = ???

def callRandomFunctions(config: config, prefix: String): Seq[ChainBuilder] =
  Random.shuffle(Seq(func1 _, func2 _, func3 _, func4 _))
        .map(_(config, prefix))
3 голосов
/ 18 июня 2019

Вы можете просто сделать это:

randomList.foreach {
    case 1 => func1(config, prefix)
    case 2 => func2(config, prefix)
    case 3 => func3(config, prefix)
    case 4 => func4(config, prefix)
}

, и это будет работать как сопоставление с шаблоном для номера, переданного обратному вызову foreach.

Другая проблема с вашим кодом заключается в том, что вы хотитедля возврата ChainBuilder из callRandomFunctions, но вы используете foreach, который завершает оператор, возвращающий Unit.Возможно, вы хотели использовать map и изменить тип возвращаемого значения на List[ChainBuilder]:

def callRandomFunctions(config: Config, prefix: String): List[ChainBuilder] = {
    val randomList = Random.shuffle(List(1, 2, 3, 4))
    randomList.map {
        case 1 => func1(config, prefix)
        case 2 => func2(config, prefix)
        case 3 => func3(config, prefix)
        case 4 => func4(config, prefix)
    }
}
2 голосов
/ 18 июня 2019

для более подходящего решения

def callRandomFunctions(config: config, prefix: String): ChainBuilder = {
  val randomList = Random.shuffle(List(1, 2, 3, 4))

  exec(session => session.set("randomList")
  .forEach("${randomList}", "currentVal") {
    doSwitch("${currentVal}") (
       1 -> exec(func1(config: config, prefix: String)),
       2 -> exec(func2(config: config, prefix: String)),
       3 -> exec(func3(config: config, prefix: String)),
       4 -> exec(func4(config: config, prefix: String))
    )
  } 

, если порядок выполнения не обязательно должен быть случайным, вы также можете использовать .roundRobinSwitch

1 голос
/ 18 июня 2019

Вы можете выполнить функцию по имени с отражением (хотя производительность не так уж велика). Вам не нужно сопоставление с шаблоном, и это просто еще один способ реализации:

Вы должны поместить все свои функции в определенный класс:

case class FunctionsClass(config: config, prefix: String) {
  def func1(config: config, prefix: String): ChainBuilder = ???
  def func2(config: config, prefix: String): ChainBuilder = ???
  def func3(config: config, prefix: String): ChainBuilder = ???
  def func4(config: config, prefix: String): ChainBuilder = ???
}

Затем внедрите callRandomFunctions так:

def callRandomFunctions(config: config, prefix: String):Unit = {
  val args = List(config, prefix)
  val argtypes = args.map(_.getClass)
  val functionsClassObj = FunctionsClass(config, prefix)
  val randomList = Random.shuffle(List(1, 2, 3, 4))

  val result = randomList.map{ i =>     
      val mtd = functionsClassObj.getClass.getMethod(s"func$i", argtypes: _*)
      Try {mtd.invoke(functionsClassObj, args: _*)}.recover { case _ => println("ERROR")}
  }

  result.filter(_.isSuccess).map(_.get))
}

Таким образом, вы вызываете свой func метод на основе идентификаторов в вашем перетасованном списке

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...