【问题标题】:Why can't I chain several Scala infix method calls为什么我不能链接多个 Scala 中缀方法调用
【发布时间】:2011-05-05 21:01:36
【问题描述】:

我正在研究 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").--&gt;(all),但解释器似乎将其视为foo.bar("x".--&gt;(all))

【问题讨论】:

    标签: scala infix-operator


    【解决方案1】:

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

    Operator precedence in Scala

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

    foo bar ("x" --> all)
    

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

    foo bar "x" to all
    

    您也可以选择优先级更高的运算符来代替bar。像~~&gt; 这样的东西会这样做,因为~ 是特殊字符并且它具有最高优先级:

    foo ~~> "x" --> all
    

    【讨论】:

    • 谢谢!我想将运算符视为方法让我忘记了它们可以具有优先级。
    猜你喜欢
    • 2013-07-09
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2023-01-13
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多