加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 18:16:35 所属栏目:安全 来源:网络整理
导读:所以我想说我想创建一个名为ImportFunc的自定义函数类型,它接受一个名为fileImportID的Int和一个名为filename的字符串.我可以使用像这样的类型别名轻松地做到这一点: type ImportFunc = (Int,String) = Unit 问题是,任何试图使用此函数的人都不知道Int和Str
所以我想说我想创建一个名为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中,这些参数被命名为v1和v2.所以我们可以这样做:

scala> f.apply(v1=123,v2="file.txt")
Importing file #123 (file.txt)

现在让我们看看它在使用语法糖时是否仍然有效(换句话说,在删除显式调用时):

scala> f(v1=123,v2="file.txt")
Importing file #123 (file.txt)

很好,它的工作原理.
现在当然v1和v2与fileImportID和filename并不完全相同,但我们可以通过一些类型细化来解决这个问题:

type ImportFunc = ((Int,String)=>Unit) { 
  def apply(fileImportID: Int,filename: String): Unit 
}

基本上这只是(Int,String)=>单位(或者换句话说,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)

成功!

一个重要的注意事项:在键入方面,ImportFunc与Function2 [Int,Unit]或任何其他类似的细化相同.这是因为参数名称不是签名的一部分.所以在我的例子中,f仍然可以传递给Function2 [Int,Unit](但从那时起,您将无法再使用自定义参数名称来调用它).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读