scala中`=> String`的类型是什么?
在
scala中,有一些按名称调用的参数:
def hello(who: => String) = println("hello," + who) 参数的类型是什么? 它将scala REPL上的函数显示为: hello: (who: => String)Unit 类型仍然是=>串?它有什么名字吗?或者一些描述类型的文档? answer提出的进一步问题 问题1 (当阅读§3.3.1(MethodTypes)的规范时) 方法类型是方法的类型,比方说我定义了一个方法hello: def hello: String = "abc" 它的类型可以写成:=>字符串,对吗?虽然你可以看到REPL响应是: scala> def hello:String = "abc" hello: String 如果我定义一个具有参数的方法: def goodname(name: String): String = name + "!" 方法的类型是什么?它应该类似于String =>字符串,但不是.因为它是方法类型,而String => String是一种函数类型. 问题2 (当阅读§3.3.1(MethodTypes)的规范时) 我可以理解为: def goodname(name: String): String = name + "!" def print(f: String => String) = println(f("abc")) print(goodname) 当我调用print(goodname)时,goodname的类型将被转换为函数类型String =>字符串,对吗? 但对于无所畏惧的方法: def hello: String = "abc" 可以转换哪种函数类型?我试过了: def print(f: () => String) = println(f()) 但这不能编译: print(hello) 错误是:
你能给我一个有效的例子吗? 问题3 (当阅读§6.26.2(MethodConversions)的规范时) 仅当类型未应用于参数时,才会发生此评估转换.所以,对于代码: def myname:String = "abc" def print(name: => String) = println(name) print(myname) 我的问题是,当我打电话给print(myname)时,是否有转换(我的意思是评估转换)?我猜,因为myname的类型只是=>字符串,因此可以直接传递给它. 如果打印方法已更改: def myname:String = "abc" def print(name: String) = println(name) print(myname) 这里的评估转换肯定发生了,对吧?(From => String to String) 解决方法
引自
§4.6.1 of the spec:
因此,按名称调用param的类型是(近似)()=> T(如果您愿意,可以是Function0 [T]).如果你:javap接受一个call-by-name参数的方法,你将看到编译的代码接受scala.Function0< java.lang.Object>类型的param. 近似的一个例子 翻译: def callByName[T](f: => T) = f callByName { /* magic */ 1 + 1 /* ends here */ } 有效地: def callByName[T](f: Function0[T]) = f.apply() callByName(new Function0[Int] { def apply() = { /* magic */ 1 + 1 /* ends here */ } }) 怀疑周围的近似 你可能想尝试传递一个()=> T到你的方法.试试callByName(()=> 12);为什么不编译? (提示,考虑呼叫站点的扩展). (将鼠标悬停在以下空白处以查看答案): ???callByName(()=> 12)无法编译的原因是因为扩展被视为: ?也就是说,不是传入返回Int的Function0,而是传递一个Function0,它返回一个返回Int的Function0. 什么=>实际上是 => T实际上是一种方法类型,而不是一个对象.因此,之前的所有内容都是编译器所做的事情的近似,并且可以随时更改.引自§3.3:
那么什么是方法类型?引自§3.3.1 (MethodTypes):
§6.26.3 (MethodConversions)州:
所以type =>的正确翻译总是: def random$name$here: T 例 这是一个可以使用的示例类: class TestParamless { def paramless: Int = 1 def callByName(f: => Int) = f def example: Int = callByName(paramless) } 尝试新的TestParamless().示例以及:javap TestParamless(在scala REPL中). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 从正在运行的容器中获取docker-compose.yml文件位置?
- 如何上传CSV文件并使用angular2阅读?
- jasmine spyOn angularjs内部方法,例如$filter(‘date’)
- Google监控系统BorgMon相似实现普罗米修斯Prometheus(一)
- 初入angular4——实际项目搭建总结
- 如何在Scala中使用反射获取所有对象值和子对象值?
- UNIX网络编程卷1:套接字联网-第4章:基本TCP套接字编程1
- Polymer元素和AngularJS指令有什么区别?
- AngularJS:暂停隐藏DOM元素的$digest和watchers
- 在Vim中为yanking选择不相交的代码块