scala – 为什么类val参数不能按名称调用?
发布时间:2020-12-16 18:16:33 所属栏目:安全 来源:网络整理
导读:我正在尝试使用一个类作为单个接口聚合一堆API函数的代理.其中一些是nullary函数,但我不希望将它们包含在类构造函数中以触发API调用.我现在的解决方案是将调用包装在一个文字的nullary函数new myClass(()= apiCall)中,然后显式调用成员函数.这并不是那么糟糕
我正在尝试使用一个类作为单个接口聚合一堆API函数的代理.其中一些是nullary函数,但我不希望将它们包含在类构造函数中以触发API调用.我现在的解决方案是将调用包装在一个文字的nullary函数new myClass(()=> apiCall)中,然后显式调用成员函数.这并不是那么糟糕,但我想知道是否有技术原因我不能只使用call-by-name参数来传递对方法的延迟引用?
例: scala> class MyClass(val apiCall: => String) <console>:1: error: `val' parameters may not be call-by-name class MyClass(val apiCall: => String) 编辑我应该指定我的问题是为什么类不能有val参数.添加了一个示例. 解决方法
一个类可以很好地具有按名称调用的参数,只要它们不是val或var:
> scala Welcome to Scala version 2.11.1 (Java HotSpot(TM) 64-Bit Server VM,Java 1.7.0_55). Type in expressions to have them evaluated. Type :help for more information. scala> class Foo(f: => Unit) { | def run(): Unit = f | } defined class Foo scala> new Foo(println("hello")) res0: Foo = Foo@5da6b8c6 scala> res0.run() hello val或var参数不能是名字的原因很简单,就是这个问题,类字段不能是名字,也不能是本地变量.所以以下内容无效: scala> class FooInvalid(val v: => Unit) { <console>:1: error: `val' parameters may not be call-by-name class FooInvalid(val v: => Unit) { ^ 但是,可以使用一个名称参数作为val字段的函数分配,就像这样(但是你必须使用()作为调用站点): scala> class FooVal(v0: => Unit) { | val v: () => Unit = () => v0 | } defined class FooVal scala> new FooVal(println("hello")) res2: FooVal = FooVal@75c145bc scala> res2.v res3: () => Unit = <function0> scala> res2.v() hello 最后,不要将v定义为type()=>的val;单位,您可以将其定义为单位类型的def.然后你会得到你可能想要的行为: scala> class FooDef(v0: => Unit) { | def v: Unit = v0 | } defined class FooDef scala> new FooDef(println("hello")) res5: FooDef = FooDef@2e04a041 scala> res5.v hello 有人可能会争辩说编译器本身应该进行这种转换,但这与val必须是稳定的语义不一致(例如,使用稳定的值可以导入x._其成员,这是不能用于不稳定的因为def(即使没有())也不是一个稳定的值.最好将这个小的重写留给用户,而不是引入一个非常奇怪的不健全. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Webservice报错java.lang.NoSuchMethodError: org.springfr
- Linux下终端的快捷键及建立打开终端的快捷键
- 如何在vim中实现项目特定的缩进?
- angularjs – 页面加载后如何淡入文本?
- 在vim和python virtualenv中带有taglist的ctags
- scala – 如何修复Dropping Close,因为SSL连接已经关闭了喷
- Angular2空响应处理
- Scala将Map [Int,Future [Seq [T]]]转换为Future [Map [Int
- 搭建yum仓库定制rpm包
- 在UNIX shell脚本中,“#!/ bin/sh”是什么意思?
推荐文章
站长推荐
热点阅读