使用运算符重载和隐式def来获得良好的语法

时间:2014-10-19 21:41:47

标签: scala operator-overloading implicit-conversion

我试图在Scala中以一种很好的方式表示布尔查询。我希望能够以这种方式定义查询:

"word1" && "word2" || !"word3"

这意味着,正如您可能猜到的那样:找到包含" word1"的所有文件。和" word2"或不包含" word3"

为此,我写了一些case类,重载了所需的运算符并创建了一些隐式转换(我删除了不相关的类代码):

abstract class Query {
    def &&(q : Query) = new And(this,q)
    def ||(q : Query) = new Or (this,q)
    def unary_!       = new Not(this)
}

object Query {
    implicit def toLitteral(s : String) = new Litteral(s)
}

case class Litteral(term : String)     extends Query 
case class And(q1 : Query, q2 : Query) extends Query
case class Or (q1 : Query, q2 : Query) extends Query
case class Not(q  : Query)             extends Query

但是,当我调用booleanSearch(q : Query)方法时,转换并不总是顺利进行。例如,booleanSearch(!"word")无法编译,说unary_!不是String的成员。同样适用于Litteral转换,但并不总是成功。有可能解决这个问题,还是应该放弃这样一个好的表达方式?

0 个答案:

没有答案