Racket:如何对结构体列表中的结构体指定字段执行filter过滤操作
问题原因
你的inYear函数过滤逻辑本身没有问题,错误出在列表的定义方式上:
- 你定义测试列表
l1时使用了引用列表写法'(e1 e2 e3 e4),Racket不会对引用列表内的标识符做求值处理,因此l1中存储的是e1、e2这类符号值,而非你之前创建的event结构体实例,自然无法通过event-year取到对应的年份值,导致过滤逻辑失效。 - 测试用例的期望结果同样使用了引用列表
'(e1 e2 e3),存储的也是符号值,和过滤后得到的结构体实例列表永远无法相等,也会导致测试不通过。
修正方案
把所有需要存储实际结构体实例的列表,从引用列表写法改为list函数创建即可,修正后完整代码如下:
(struct event (name day month year xlocation ylocation) #:transparent) (define e1 (event "new years" 1 "Jan" 2021 0 0)) (define e2 (event "valentines" 14 "Feb" 2021 2 2)) (define e3 (event "my birthday" 6 "Mar" 2021 10 10)) (define e4 (event "tyler's birthday" 10 "Sep" 2020 20 20)) ;; 改用list函数创建列表,参数会被正常求值得到结构体实例 (define l1 (list e1 e2 e3 e4)) (define (inYear year events) (filter (lambda (e) (equal? (event-year e) year)) events)) ;; 期望结果也改用list函数生成 (check-expect (inYear 2021 l1) (list e1 e2 e3))
内容的提问来源于stack exchange,提问作者Nikki Roberts
相关产品推荐
相关产品推荐

