可以在扩展的scala类中扩展方法吗?
假设我有以下scala类,是否可以在SecondClass上扩展函数并向其添加更多代码?(可能链接到我要扩展的函数中的另一个函数) 我想用以下内容扩展登录功能(.check(状态为200)可以在扩展的scala类中扩展方法吗?,scala,gatling,Scala,Gatling,假设我有以下scala类,是否可以在SecondClass上扩展函数并向其添加更多代码?(可能链接到我要扩展的函数中的另一个函数) 我想用以下内容扩展登录功能(.check(状态为200) 这可能吗?您要查找的语法是 class X { def go(a: Int) = ??? } class Y extends X { override def go(a: Int) = { val u = super.go(a) // do things with `u` and r
这可能吗?您要查找的语法是
class X {
def go(a: Int) = ???
}
class Y extends X {
override def go(a: Int) = {
val u = super.go(a)
// do things with `u` and return whatever
}
}
你需要做一点重构才能使你的代码处于这种状态
class FirstClass {
def body = ElFileBody("rest/UserAnonymousLogin.json")
// stuff that calls `body`
}
class SecondClass {
override def body = super.body.check(status is 200)
// no need to redefine stuff as it's inherited from `FirstClass`
}
给定的方法接受一个数量可变的HttpCheck
,即HttpCheck*
def check(checks: HttpCheck*): HttpRequestBuilder
考虑将FirstClass
重构为
class FirstClass {
def login(checks: HttpCheck*) = {
exec(http("Login")
.post("anonymous/login")
.body(ElFileBody("rest/UserAnonymousLogin.json")).asJson
.check(checks: _*)
)
}
}
请注意,在调用(new FirstClass.)login()时,默认情况下我们是如何不通过任何检查的
现在,派生类可以通过一个类似这样执行的检查
class SecondClass extends FirstClass {
def loginWithStatusCheck() = {
super.login(status is 200)
}
}
请注意,我们实际上并没有覆盖第一类。请在此处登录
另一种代替重写的方法是函数合成,例如,我们将问题分解为更小的函数
val buildClient: String => Http = http(_)
val buildPostRequest: Http => HttpRequestBuilder = _.post("anonymous/login").body(ElFileBody("rest/UserAnonymousLogin.json")).asJson
val checkStatus: HttpRequestBuilder => HttpRequestBuilder = _.check(status is 200)
然后再创作它们
exec((buildClient andThen buildPostRequest andThen checkStatus)("Login"))
现在,我们可以简单地向组合中添加进一步的步骤,而不用担心类层次结构和重写。这是可能的,但是这里的状态是什么?它没有在代码中定义。check(状态为200)是一个应该在.body之后的链。因此,在我想要的登录扩展之后,它看起来像:exec(http(“login”)).post(“匿名/登录”).body(ElFileBody(“rest/UserAnonymousLogin.json”).check(状态为200))).asjson编译吗?我不知道在这两个示例中status
是在哪里定义的。status是包io.gatling.http.check的一部分,如果您导入它,它会编译。在我的示例中,扩展的功能与此无关。我的问题是,允许这种类型的函数链扩展的语法是什么。当然,尽管它总是有帮助的当所有内容都定义好后,这里的人会回答问题,请看,这非常有帮助,非常感谢!您的回答也让我意识到我没有正确地问这个问题,因为我实际上是在尝试将方法链接到函数未返回的对象上,请允许我使用以下示例:类测试{def login()={http(“Login”).post(“Login”).body(ElFileBody(“Login.json”)).asJson.check(状态为200)}def login2()={exec(http(“Login”).post(“Login”).body(ElFileBody(“Login.json”).asJson.check(状态为200))}类Test2扩展了测试{override def Login=super.Login.check()override def login2=super.login2.check}
堆栈溢出拒绝将我的答案显示为代码:(无论如何,示例login2不会编译,因为我实际上是在尝试在http上链接,而实际上是在exec上链接。我确实希望exec在原始方法上,但在需要时添加另一个验证,有什么办法吗?很好!非常感谢!我会使用def login(检查:HttpCheck*)
和超级登录(状态为200)
。
val buildClient: String => Http = http(_)
val buildPostRequest: Http => HttpRequestBuilder = _.post("anonymous/login").body(ElFileBody("rest/UserAnonymousLogin.json")).asJson
val checkStatus: HttpRequestBuilder => HttpRequestBuilder = _.check(status is 200)
exec((buildClient andThen buildPostRequest andThen checkStatus)("Login"))