我有一个整数列表,需要遍历该列表并调用具有相同输入参数的不同函数,这是我的代码:
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
答案 0 :(得分:6)
只需对函数进行随机组合,然后直接调用它们即可。
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))
答案 1 :(得分:3)
您可以简单地执行以下操作:
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 :(得分:2)
获得更灵活的解决方案
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
答案 3 :(得分:1)
您可以使用反射的名称来执行该函数(尽管性能不是很好)。 您不需要模式匹配,这只是另一种实现方式:
您需要将所有函数放在特定的类中
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))
}
通过这种方式,您可以根据随机列表中的ID调用func
方法