gpt4 book ai didi

scala - Scala-方法优先级

转载 作者:行者123 更新时间:2023-12-03 14:11:39 25 4
gpt4 key购买 nike

我是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)可以写为a m b
不需要参数的任何方法都可以用作后缀运算符:a.m可以写为a m
Postfix运算符的优先级低于infix运算符,因此foo bar baz表示foo.bar(baz),而foo bar baz bam表示(foo.bar(baz)).bamfoo 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

关于scala - Scala-方法优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7597501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com