2012-11-26 27 views
1

沒有發現鑑於這種非常簡單的變量 - 第模型重點在地圖

class Variable(name: String, negated: Boolean = false) { 
    def evaluate(b: Boolean): Boolean = negated match { 
     case false => b 
     case true => !b 
    } 

    def negate = new Variable(this.name, !this.negated) 

    override def toString = negated match { 
     case false => name 
     case true => "~" + name 
    } 

    override def hashCode() = name.hashCode() 

    override def equals(obj: Any) = name.equals(obj) 
} 

class Clause(vars: List[Variable]) { 
    def evaluate(values: Map[Variable, Boolean]): Boolean = { 
     val evaluatedVars = vars.map(v => v.evaluate(values(v))) 
     (false /: evaluatedVars)(_ || _) 
    } 
} 

這簡單的斷言拋出一個異常

val c = new Variable("c") 
val d = new Variable("d") 
val c3 = new Clause(List(c.negate, d)) 
assertTrue(c2.evaluate(Map(c -> false, d -> true))) 

java.util.NoSuchElementException:關鍵未找到:〜Ç

我錯過了什麼?

回答

6

Variable不是String。您的equals已損壞。

你想:

override def equals(a: Any) = a match { 
    case v: Variable => v == name 
    case s: String => name == s 
    case _ => false 
} 

(如果你不希望暴露name甚至私下裏,但你要Variable匹配隨機字符串)。