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

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(即使没有())也不是一个稳定的值.最好将这个小的重写留给用户,而不是引入一个非常奇怪的不健全.

(编辑:李大同)

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

    推荐文章
      热点阅读