我正在使用Scala IDE(Eclipse Luna)与Gatling合作,我遇到了这个我想要理解的问题。
我有这个功能
import io.gatling.core.session.Session
import io.gatling.core.Predef._
object Predef {
def justDoIt(param: String): Session => Session = s => s.set("some", param)
}
我试图以这种方式使用它
val testScenario1 = scenario("Test")
.exec(justDoIt("hello world"))
val testScenario2 = scenario("Test")
.exec(justDoIt("hello world")(_))
由于某种原因,只有后者编译。前者抱怨过载不适用于Session => Session
类型的论证。
我想了解这两行之间的区别以及为什么第一行无法编译。
我也做了以下测试,两种语法似乎都在做同样的事情:
scala> def hello(fn: String => String) = fn("Hello")
hello: (fn: String => String)String
scala> def message(name: String): String => String = greeting => s"$greeting $name"
message: (name: String)String => String
scala> hello(message("world"))
res1: String = Hello world
scala> hello(message("world")(_))
res2: String = Hello world
答案 0 :(得分:5)
根据做here:
exec也可以传递一个表达式函数。
...这是docs:
Session => Validation[T]
另请注意第一个链接的摘录:
对于那些想知道管道如何工作以及如何在上面的示例中返回会话而不是验证[会话]的人来说,这要归功于隐式转换。
现在,通过该信息,您可以看到,在第一种情况下,您要传递exec
类型为Session => Session
的内容(范围内没有隐式转换为Expression[Session]
的范围)你得到编译错误。
在第二种情况下,您使用占位符/部分应用程序:
justDoIt("hello world")(_)
......相当于:
x => justDoIt("hello world")(x)
...可以从返回值的隐式转换中受益(从Session
到Validation[Session]
),因此整个表达式被推断为符合Expression[Session]
exec
需要什么。
更新:这是进行转化的alias for。
更新2 :要使您的原始示例正常工作,您可以像这样简单地更改justDoIt
的返回类型(从隐式转换中受益):
def justDoIt(param: String): Session => Validation[Session] = s => s.set("some", param)