我如何在scala中提取一个序列

How do I extract a sequence in scala

我是 Scala 的新手,我正在努力提取我的 gatling 测试的公共部分。

exec(
  http("Open Page")
    .get("/page")
).exec(
  http("GET from REST")
    .get("/")
    .disableFollowRedirect
    .resources(
      http("x").get("/rest/x/").check(jsonPath("$.x").exists),
      http("y").get("/rest/y/").check(jsonPath("$.y").exists)
    )
)

我怎样才能做到这一点:

exec(
  http("Open Page")
    .get("/page")
).exec(
  http("GET from REST")
    .get("/")
    .disableFollowRedirect
    .resources(
      resources
    )
)

val resources = ...???

.resources 签名看起来像这样

def resources(res: HttpRequestBuilder*): 

还有一个... 由于我即将统一一些传递的资源值,通常我必须添加一些额外的东西,应该使用什么语法来使下面的代码正确。

exec(
  http("Open Page")
    .get("/page")
).exec(
  http("GET from REST")
    .get("/")
    .disableFollowRedirect
    .resources(
      common: _*,
      http("z").get("/rest/z/").check(jsonPath("$.z").exists)
    )
)

val common: Seq[HttpRequestBuilder] = Seq(
    http("x").get("/rest/x/").check(jsonPath("$.x").exists),
    http("y").get("/rest/y/").check(jsonPath("$.y").exists)
)

我明白了

exec(
  http("Open Page")
    .get("/page")
).exec(
  http("GET from REST")
    .get("/")
    .disableFollowRedirect
    .resources(
      common:+
      http("z").get("/rest/z/").check(jsonPath("$.z").exists): _*
    )
)

但也许有 "proper" 方法可以做到这一点。

val resources: Seq[HttpRequestBuilder] = ??? // Or subtype
...
// Type ascription, but functionally equivalent to other languages' "splat" operators
.resources(resources: _*)

类型归属是 expr: Type 形式的表达式。这种表达式的类型是 Type,编译器必须以某种方式使 expr 符合该类型。在这里对可变参数使用它的基本原理是 resources 的参数是 HttpRequestBuilder* (即使没有这样的类型),所以你可以使用类型归属让编译器解释一个对象键入 Seq[HttpRequestBuilder] 作为 HttpRequestBuilder*,即使这样的类型实际上并不存在。它使用通配符 _,因此您不必键入整个类型名称。

编辑:是的,如果您想将资源列表与其他内容合并,然后将其作为可变参数传递,您应该这样做

.resources(somethingelse +: resources: _*)

(使用前缀 +:,因为根据 resources 的实施,这可能更有效。)