我自己写
range
那工具
ISeq
. 我的原始实现
equiv
只是打电话
seq
在我的范围和其他列表中,并使用
=
:
(defn equals? [this-range other-range]
(= (seq this-range) (seq other-range)))
这看起来不错,但后来我遇到了一些奇怪的行为:
(= (new-range 5 10)
(range 5 10))
=> true
(= (range 5 10)
(new-range 5 10))
=> false ; Uh oh
在哪里?
new-range
是我的自定义构造函数。
看看如何
LongRange
处理等价,我检查了它的来源。它代表
ASeq
,和
ASEQ
的
当量
方法以行开始:
public boolean equiv(Object obj) {
if (!(obj instanceof Sequential) && !(obj instanceof List)) {
return false;
. . .
因为我的范围没有实现
Sequential
或
List
,此检查失败。它甚至不尝试迭代我的范围来进行值比较。
这里的理由是什么?
相继的
只是一个空接口。它似乎只是存在于将类“标记”为连续的,而不需要任何方法。
我只要我的测距仪
相继的
允许检查,但是我想知道我的等价函数是否应该包括与
ASEQ
也。不过,这似乎是一张不必要的支票,因为
顺序
将在错误的参数上失败,通过
clojure.lang.RT/seqFrom
.
目的是什么
相继的
检查,我应该执行吗
相继的
为了安抚这种方法,我也应该用类似的方法做这样的检查吗?