我试图在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
转换,但并不总是成功。有可能解决这个问题,还是应该放弃这样一个好的表达方式?