gpt4 book ai didi

scala - 为什么我不能链接多个 Scala 中缀方法调用

转载 作者:行者123 更新时间:2023-12-01 19:07:30 25 4
gpt4 key购买 nike

我正在开发 DSL,并且在使用方法作为链中的中缀运算符时遇到了问题。我将尝试用一些代码来解释它。我有一个特征 Term 和案例类 LiteralVariable 扩展它。我想使用一些运算符构建术语实例列表。

case class Expr(val terms: List[Term]) {
def +(v: String) = Expr(Literal(v) :: terms)
def -->(func: List[String] => List[String]) = terms match {
case Literal(v) :: ts => Expr(Variable(v, func) :: ts)
case _ => throw new Exception("Can only apply function on literal")
}
}

object foo {
def bar(name: String) = Expr(Literal(name) :: Nil)
}

// some functions
val one = ...
val all = ...

// works
foo bar "x"
// res1: Expr = Expr(List(Literal(x)))

// works not
foo bar "x" --> all
// error: value --> is not a member of java.lang.String

// works
(foo bar "x") --> all
// res1: Expr = Expr(List(Variable(x,<function1>)))

我希望这相当于 foo.bar("x").-->(all) 但解释器似乎将其视为 foo.bar("x".-->(全部)).

最佳答案

您可以在此处找到运算符优先级:

Operator precedence in Scala

根据第一个答案 - 与字母相比具有更高的优先级。因此编译器将表达式分组如下:

foo bar ("x" --> all)

如果您将 --> 替换为优先级较低的内容(例如字母),那么它应该可以编译。例如:

foo bar "x" to all

您还可以选择更高优先级的运算符来代替 bar。像 ~~> 这样的东西就可以做到这一点,因为 ~ 是特殊字符,并且它具有最高优先级:

foo ~~> "x" --> all

关于scala - 为什么我不能链接多个 Scala 中缀方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5904038/

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