5

私は1つの名前空間で次のように言っていますshapes:

(derive ::rect ::shape)
(derive ::square ::rect)

shapes名前空間で次を実行します。

(isa? ::square ::shape)

戻りますtrue。しかし、実際に描画用のマルチメソッドを実装している名前空間で次を実行すると、

(isa? ::square ::shape)

戻りますfalse。そのため、正しいマルチメソッド ディスパッチ関数が配置されていても、「ディスパッチ関数が見つかりません」というエラーが表示されます。

何か不足していますか?すべてのタイプのシェイプを 1 つの巨大な名前空間に実装することは、私には無意味に思えます。

4

3 に答える 3

3

:: は現在の名前空間を使用するため、他の名前空間の型を使用するには、:shapes/square などの完全修飾名を使用する必要があります。

于 2010-06-17T17:15:17.983 に答える
0

あなたの自己回答では、 :: 演算子が現在の名前空間で何かを見つけることは正しいです。

興味深い点の 1 つは、任意のファイルで宣言されていない名前空間であっても、任意の名前空間でキーワードを名前空間にできることです。したがって、名前空間ツリーが複雑で、:geometry/square、:geometry/circle などを好む場合は、そのまま使用できます。

また、derive、underive (今は underive を使用しないでください)、isa を忘れないでください。および関連する関数はすべて、必要に応じて独立した階層を使用できます。いつ、どのように独立した階層を clojure で使用する必要がありますか? を参照してください。

于 2010-06-17T19:12:58.543 に答える
0

::名前空間エイリアスでも使用できます。

(ns some.other.package
  (:require [some.terr.ibly.long.package.name :as short]))

現在:::short/abcと同じものを参照します:some.terr.ibly.long.package.name/abc

于 2010-06-17T21:23:55.940 に答える