为什么可以';我链接了几个Scala中缀方法调用
我正在研究DSL,在使用方法作为链中的中缀运算符时遇到了一个问题。我将尝试用一些代码来解释它。我有一个trait为什么可以';我链接了几个Scala中缀方法调用,scala,infix-operator,Scala,Infix Operator,我正在研究DSL,在使用方法作为链中的中缀运算符时遇到了一个问题。我将尝试用一些代码来解释它。我有一个traitTerm和case类Literal和Variable扩展它。我想使用一些操作符构造一个术语实例列表 case class Expr(val terms: List[Term]) { def +(v: String) = Expr(Literal(v) :: terms) def -->(func: List[String] => List[String]) = term
Term
和case类Literal
和Variable
扩展它。我想使用一些操作符构造一个术语实例列表
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>)))
案例类表达式(val术语:列表[术语]){
def+(v:String)=Expr(文字(v)::术语)
def-->(func:List[String]=>List[String])=术语匹配{
大小写文字(v)::ts=>Expr(变量(v,func)::ts)
case=>抛出新异常(“只能对文本应用函数”)
}
}
对象foo{
定义栏(名称:字符串)=Expr(文字(名称)::Nil)
}
//一些功能
val one=。。。
val all=。。。
//工作
富吧“x”
//res1:Expr=Expr(列表(文本(x)))
//行不通
foo-bar“x”-->全部
//错误:值-->不是java.lang.String的成员
//工作
(foo-bar“x”)-->all
//res1:Expr=Expr(列表(变量(x,))
我希望这相当于
foo.bar(“x”)-->(all)
,但解释器似乎将其视为foo.bar(“x”)-->(all))
您可以在这里找到运算符优先级:
根据第一个答案,-
比字母具有更高的优先级。所以编译器组的表达式如下所示:
foo bar ("x" --> all)
如果将-->
替换为优先级较低的内容(例如字母),则应编译它。例如:
foo bar "x" to all
您也可以选择更高优先级的运算符,而不是bar
。类似于~~>
的内容将执行此操作,因为~
是特殊字符,具有最高优先级:
foo ~~> "x" --> all
谢谢我想把操作符看作方法让我忘记了它们可以有优先权。