我正在尝试用Racket和Dr. Racket建立经典游戏“Snake”。
我喜欢使用单元测试来判断我是否理解了代码背后的概念。
我开始为Snake和2维(2D)平面中的位置创建结构定义:
(struct snake (dir segs))
(struct posn (x y))
之后,我创建了一个蛇示例:
(define snake-example
(snake "up" (list (posn 1 1) (posn 1 2) (posn 1 3))))
如果我尝试访问我的蛇对象上的segs,我会打电话:
(snake-segs snake-example)
>> '(#<posn> #<posn> #<posn>)
与调用相同:
(list (posn 1 1) (posn 1 2) (posn 1 3))
>> '(#<posn> #<posn> #<posn>)
但是,如果我尝试使用测试和rackunit进行检查,则不起作用:
(require rackunit)
(check-equal? (snake-segs snake-example) (list (posn 1 1) (posn 1 2) (posn 1 3)))
我得到了这个答案:
FAILURE
actual: (#<posn> #<posn> #<posn>)
expected: (#<posn> #<posn> #<posn>)
name: check-equal?
location: (#<path:/home/pedro/Desktop/realm-of-racket/cap-6.rkt> 276 0 8425 81)
expression: (check-equal? (snake-segs snake-example) (list (posn 1 1) (posn 1 2) (posn 1 3)))
为什么会这样?
答案 0 :(得分:3)
简短的回答是,默认情况下,Racket结构是不透明的,不透明结构上的相等性不会看成员。有关详细信息以及如何解决此问题,请参阅Structure Comparisons。
对于快速修复,您可以使您的posn结构透明:
(struct posn (x y) #:transparent)
问题不限于check-equal?
。如果我们使用上面的示例,equal?
也会显示此行为:
(equal?
(snake-segs snake-example)
(list (posn 1 1) (posn 1 2) (posn 1 3))) ; false