如何使用命名参数在Scala中创建自定义函数类型?
所以我想说我想创建一个名为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方法的定义中. 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) 很好,它的工作原理. 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](但从那时起,您将无法再使用自定义参数名称来调用它). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 轻松安装docker并运行docker swarm模式
- twitter-bootstrap – Bootstrap 3 Navbar不会在
- WebSerice学习笔记1——WebSerice基础
- Angular4.x Event (DOM事件和自定义事件)
- bootstrap datetimepicker调整开始日期
- scala – 为什么sbt编译失败并出现StackOverflow
- unexpected element (uri:"", local:
- 我怎么知道什么Scala版本的.class文件被编译?
- Angular 2错误:无法绑定到’innerhtml’,因为它
- 【运维专家大讲堂】腾讯资深运维专家周小军:QQ与