在UNIQUE和另一組操作所述相等性檢查的實施似乎是Cmp_Value
,並且比較被完成的方式是要減去的對象的幀的指針。如果減爲零(例如,這些都是同一個對象?)則比較被認爲是匹配:
f-series.c Line 283, R3-Alpha open source release
如果你看看周圍的代碼,你會看到同樣的程序來Cmp_Block通話。在Cmp_Block的情況下,它不會遞歸比較,和榮譽的大小寫......所以之間的差異如何塊和對象行爲:
Cmp_Block() in f-series.c
由於它被寫了,如果你想一個UNIQUE操作是基於對象與其身份的字段逐場比較,除了編寫自己的例程並調用EQUAL?或修改C代碼外,沒有辦法做到這一點。
這是一個短暫的黑客攻擊,不需要改變C源代碼,它在UNIQUE的輸出上執行MAP-EACH。身體過濾出任何平等?已經被看到(因爲當MAP-EACH收益未設定的身體,它增加了沒什麼結果)對象:
my-unique: function [array [block!]] [
objs: copy []
map-each item unique array [
if object? :item [
foreach obj objs [
if equal? item obj [unset 'item break]
]
unless unset? :item [append objs item]
]
:item ;-- if unset, map-each adds nothing to result
]
]
不幸的是,你必須使用一個BLOCK!而不是地圖!隨時跟蹤對象,因爲MAP!目前不允許對象作爲鍵。如果他們允許的話,他們可能會遇到同樣的問題,即不對散列字段相同的對象進行散列。
(注:要解決這個和其他問題上的任-C的分支,其中除了目前是最快的Rebol解釋器fundamental fixes的雷達,也有一點enhancements to the set operations討論,chat)
只是想添加一個注意,這是僅R3,但在那裏工作很好。感謝你的回答! –