我定义了一个这样的结构
(struct anobject name1 name2 name3)
我创建包含这些结构的列表
(define list1 (list (anobject name1a name2a name3a)
(anobject name1b name2b name3b)))
然后我希望获得name2或name3给定name1的值。
一种方法是编写2个函数
(define (get-name2 name1)
...)
(define (get-name3 name1)
...)
循环遍历列表,查找name1与name1 arg匹配的struct,并返回我们想要的属性。
但是这两个函数除了一个访问name2之外基本相同,另一个访问name3。如果我添加更多字段,我将不得不添加更多功能。
使用单个函数(或其他方式)检索name2 / name3是否有更好的方法?
答案 0 :(得分:1)
我认为更好的方法是首先使用库函数找到具有匹配的name1
字段的项目,然后提取所需的字段。
您可以将访问器函数作为参数传递,因此您只需要一个函数。
在球拍中的例子,但它不应该太难以适应"你的"方案:
(require srfi/1) ; For 'find'
(struct anobject (name1 name2 name3))
(define (lookup n1 field ls)
(let ((r (find (lambda (x) (equal? (anobject-name1 x) n1)) ls)))
(and r (field r))))
使用示例:
> (define l1 (list (anobject "name1a" "name2a" "name3a")
(anobject "name1b" "name2b" "name3b")))
> (lookup "name1b" anobject-name2 l1)
"name2b"
> (lookup "name1b" anobject-name3 l1)
"name3b"
> (lookup "name1c" anobject-name3 l1)
#f