2

我一直在玩 Racket 和 Rackunit。我正在将我的小型静态站点生成器移植到 Racket 并编写单元测试并遇到了这个奇怪的问题。

#lang racket
(require (planet esilkensen/yaml:2:1))
(require rackunit)

(define some-yaml 
  (string->yaml " - name : ding"))

(check-equal? some-yaml '(#hash(("name" . "ding"))) )

有人可以向我解释为什么测试失败并显示以下输出:

Welcome to DrRacket, version 5.3.3 [3m].
Language: racket; memory limit: 128 MB.
--------------------
FAILURE
name:       check-equal?
location:   (#<path:/home/ding/Documents/racket/blog-generator> 7 0 119 45)
expression: (check-equal? x '(#hash(("name" . "ding"))))
actual:     (#hash(("name" . "ding")))
expected:   (#hash(("name" . "ding")))
4

3 回答 3

4

它与可变哈希与不可变哈希有关。以下测试将通过:

(check-equal? some-yaml (list (make-hash '(("name" . "ding")))))

make-hash可变哈希构造函数在哪里。

正如 Eli 提到的,可变和不可变哈希以相同的方式打印令人困惑,因此我报告了一个错误。

于 2013-04-29T17:32:02.440 回答
4

'#hash(...)在您的源代码中被读取为不可变哈希,但看起来该库生成了一个可变哈希。(不幸的是,它们的打印方式相同。)

于 2013-04-29T17:30:51.350 回答
3

我的猜测是,结果string->yaml是一个可变哈希,它永远不等于一个不可变哈希(请参阅文档)。

于 2013-04-29T17:31:12.627 回答