我试着用球拍和博士制作经典游戏“蛇”。
我喜欢使用单元测试来查看我是否理解代码背后的概念。
我开始为Snake和二维(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)))这一切为什么要发生?
发布于 2016-11-06 17:15:49
简单的回答是,在默认情况下,球拍结构是不透明的,而不透明结构上的相等性不会考虑成员。有关更多细节,以及如何修复它,请参见结构比较。
为了进行快速修复,您可以使posn结构透明:
(struct posn (x y) #:transparent)这个问题并不局限于check-equal?。如果我们使用上面的例子,equal?也会显示这种行为:
(equal?
(snake-segs snake-example)
(list (posn 1 1) (posn 1 2) (posn 1 3))) ; falsehttps://stackoverflow.com/questions/40452043
复制相似问题