2011-07-14 4 views
4
に呼び出す
(ns protocols-records-learning.core) 

(defprotocol Hit-points 
    "Able to be harmed by environment interaction." 
    (hit? [creature hit-roll] "Checks to see if hit.") 
    (damage [creature damage-roll] "Damages target by damage-roll, negated by per-implementation factors.") 
    (heal [creature heal-roll] "Heals creature by specified amount.")) 

(defrecord Human [ac, health, max-health] 
    Hit-points 
    (hit? [creature hit-roll] (>= hit-roll ac)) 
    (damage [creature damage-roll] (if (pos? damage-roll) (Human. ac (- health damage-roll) max-health))) 
    (heal [creature heal-roll] (if (pos? heal-roll) 
        (if (>= max-health (+ heal-roll health)) 
         (Human. ac max-health max-health) 
         (Human. ac (+ heal-roll health) max-health))))) 

(def ryan (atom (Human. 10 4 4))) 

(defn hurt-ryan 
    "Damage Ryan by two points." 
    [ryan] 
    (swap! ryan (damage 2))) 

がエラーにつながる:単一の方法:インターフェースの損傷:機能見つかりprotocols_records_learning.core.Hit_points:プロトコルの損傷:ヒットスレッド「メイン」java.lang.IllegalArgumentExceptionがでスワップでプロトコルエラーが発生しました。 Clojureの

例外-points(core.clj:34)

誰かがこのエラーを説明し、それを引き起こしていること、そして原子を正しく変更する方法はありますか?

答えて

5

これは動作するはずです。

(defn hurt-ryan 
    "Damage Ryan by two points." 
    [ryan] 
    (swap! ryan damage 2)) 

注意してください。削除されたペアの括弧は損傷の周囲にあります。このエラーメッセージは、Clojureが1のアリティで損傷のバージョンを見つけられなかったことを伝えようとしている不気味な試みです。損傷の周りのぼんやりはそれを正確に行うようにします:1つの引数(2)で損傷を呼び出します。

エラーメッセージの改善は、まだプロトコルに達している進行中のタスクです。

関連する問題