gpt4 book ai didi

scala - 如何在 Scala 中使用命名参数创建自定义函数类型?

转载 作者:行者123 更新时间:2023-12-04 19:05:38 24 4
gpt4 key购买 nike

因此,假设我想创建一个名为 ImportFunc 的自定义函数类型,它接收一个名为 fileImportID 的 Int 和一个名为 filename 的字符串。我可以使用像这样的类型别名很容易地做到这一点:

type ImportFunc = (Int, String) => Unit

问题是,任何尝试使用此函数的人都不知道 Int 和 String 实际上应该是什么。有什么办法可以写出类似的东西:
type ImportFunc = (fileImportID: Int, filename: String) => Unit

最佳答案

当您调用一个函数时,您实际上是在调用该函数的 apply 方法。
换句话说,鉴于此:

def doImport(fileImportID: Int, filename: String) {
println(s"Importing file #$fileImportID ($filename)")
}

以下片段:
val f = doImport _
f(123, "file.txt")

...只是语法糖:
val f = doImport _
f.apply(123, "file.txt")

如果在使用命名参数进行调用时编译器会在某个地方查找参数的名称,则必须在 apply 中。方法的定义。
原来在 Function2 ,这些参数被命名为 v1v2 .所以我们可以这样做:
scala> f.apply(v1=123, v2="file.txt")
Importing file #123 (file.txt)

现在让我们看看它在使用语法糖时是否仍然有效(换句话说,在删除对 apply 的显式调用时):
scala> f(v1=123, v2="file.txt")
Importing file #123 (file.txt)

不错,有效。
现在当然 v1v2fileImportID 不太一样和 filename ,但我们可以通过一些类型细化来解决这个问题:
type ImportFunc = ((Int, String)=>Unit) { 
def apply(fileImportID: Int, filename: String): Unit
}

基本上这只是 (Int, String)=>Unit (或者换句话说 Function2[Int, String, Unit] )但重新定义为 apply使用我们想要的参数名称。
让我们看看这个:
scala> val f: ImportFunc = doImport _
f: ImportFunc = <function2>
scala> f(fileImportID=123, filename="file.txt")
Importing file #123 (file.txt)

成功!

一个重要的旁注:在打字方面, ImportFuncFunction2[Int, String, Unit] 相同,或任何其他类似的改进。
这是因为参数名称不是签名的一部分。所以在我的例子中 f仍然可以在任何地方传递 Function2[Int, String, Unit]是期待
(但从那时起,您将无法再使用自定义参数名称调用它)。

关于scala - 如何在 Scala 中使用命名参数创建自定义函数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25644840/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com