def props(factory: (TransactionId,
String,
ImageName,
Boolean,
ByteSize,
Int,
Option[ExecutableWhiskAction]) => Future[Container])
让我们从外向内解开这个定义。
def props(x: A) 定义了一个名为props 的函数或方法(取决于特定的上下文),它采用A 类型的参数x。在这种情况下,由于没有定义结果类型(我们没有def props(x: A): B),结果类型由编译器推断。
然后我们可以展开:
-
x 到 factory。参数绑定到factory。
-
A 到 (TransactionId, String, ImageName, Boolean, ByteSize, Int, Option[ExecutableWhiskAction]) => Future[Container]
factory 是一个和其他值一样的值。在这种情况下,(TransactionId, String, ImageName, Boolean, ByteSize, Int, Option[ExecutableWhiskAction]) => Future[Container] 只是另一种说法(这种翻译由编译器执行):
Function7[TransactionId, String, ImageName, Boolean, ByteSize, Int, Option[ExecutableWhiskAction], Future[Container]]
任何属于这种类型实例的对象都可以传递给props。这种类型只有一种感兴趣的方法:
def apply(x1: TransactionId,
x2: String,
x3: ImageName,
x4: Boolean,
x5: ByteSize,
x6: Int,
x7: Option[ExecutableWhiskAction]): Future[Container]
这个类型代表的是一个来自给定类型的 7 个参数的函数(为了简洁起见,我不会再次命名它们),结果是 Future[Container]。
简而言之,我们有一个函数/方法(就我们的目的而言,这里没有区别,给出的代码并没有说明我们是在处理函数还是方法),它将函数作为参数。这使它成为一个高阶函数:在像 Scala 这样的语言中,函数是“一等”值,例如 Int,高阶函数的使用几乎是无限的。
在这种情况下,这基本上意味着props 函数/方法(或它委托给的一些其他函数/方法)有一些方法可以获取TransactionId、String、ImageName 、Boolean、ByteSize、Int 和 Option[ExecutableWhiskAction] 和您,props 的调用者可以提供一种方法来获取您从这些值中选择的Future[Container],props 将(如果它决定:就像任何函数一样,props 可以决定(例如,如果某处有错误)不使用您传递给它的参数)如果它需要 Future[Container],则使用它。
如何创建Function7?
val x: Function7[...] = new Function7 {
def apply(...): ... = ???
}
或
object MyFactory extends Function7[...] {
def apply(...): ... = ???
}
- 在许多情况下更惯用的是,您可以使用 lambda 表达式,编译器会将其转换为与上述代码的第一位非常相似的内容:
{ (x1: TransactionId, x2: String, x3: ImageName, x4: Boolean, x5: ByteSize, x6: Int, x7: Option[ExecutableWhiskAction]) =>
// some code that results in a `Future[Container]`
}
- 如果您有一些
foo 对象,该对象具有 bar 方法,该方法采用适当的参数并具有适当的结果
foo.bar _