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

Scala – 方法优先

发布时间:2020-12-16 09:31:44 所属栏目:安全 来源:网络整理
导读:我是Scala的新人我想知道是否可以使用方法调用定义一些优先级。例如,如果我有方法调用链: someObject method1 param1 method2 param2 method3 param3 这可以等同于以下内容: someObject.method1(param1).method2(param2.method3(param3)) 要么 someObject
我是Scala的新人我想知道是否可以使用方法调用定义一些优先级。例如,如果我有方法调用链:

someObject method1 param1 method2 param2 method3 param3

这可以等同于以下内容:

someObject.method1(param1).method2(param2.method3(param3))

要么

someObject method1 param1 method2 (param2 method3 param3)

所以我想要method3优先于method2 …

我想这样做的原因是我想开发一个DSL,所以我想避免使用点和括号尽可能多。如果你们为我找到另一个解决方案,请随时让我知道。

解决方法

您必须使用具有特殊操作符字符的方法来影响Tomasz暗示的优先级。这部分是为什么大量的Scala DSL大量使用操作符。也是为什么有些DSL很难阅读,如果你不与他们每天工作。

给定方法只使用字母,下划线和数字 – 您将无法影响事情,这里是我阅读规格后自己放在一起的事情:

>任何采用单个参数的方法都可以用作中缀运算符:a.m(b)可以写成m b。
>任何不需要参数的方法都可以用作postfix操作符:a.m可以写成m。
> Postfix操作符的优先级低于中缀操作符,因此foo bar baz表示foo.bar(baz),而foo bar baz bam意味着(foo.bar(baz))。bam和foo bar baz bam bim意味着(foo.bar(baz ))。BAM(BIM)。

所以,不知道你的方法签名是什么,以下代码(因为它都是字母数字):

someObject method1 param1 method2 param2 method3 param3

将被解析为:

someObject.method1(param1).method2(param2).method3(param3)

如果您将method3重命名为| * |或者:或者任何操作符是有意义的,你可以实现你想要的:

someObject method1 param1  method2 param2 |*| param3
// same as
someObject.method1(param1).method2(param2.|*|(param3))

例如看到的区别:

implicit def pimp(s:String) = new {
    def |*|(t:String) = t + s
    def switch(t:String) = t + s 
}

scala> "someObject" concat "param1" concat "param2" |*| "param3"
res2: java.lang.String = someObjectparam1param3param2

scala> "someObject" concat "param1" concat "param2" switch "param3"
res3: java.lang.String = param3someObjectparam1param2

(编辑:李大同)

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

    推荐文章
      热点阅读