列表中结构字段的获取器
Getters for struct fields in a list
我这样定义一个结构体
(struct anobject name1 name2 name3)
我创建了包含这些结构的列表
(define list1 (list (anobject name1a name2a name3a)
(anobject name1b name2b name3b)))
然后我想得到给定 name1 的 name2 或 name3 的值。
一种方法是编写 2 个函数
(define (get-name2 name1)
...)
(define (get-name3 name1)
...)
循环遍历列表以查找 name1 与 name1 arg 匹配的结构和 return 我们想要的 属性。
但这2个函数除了一个访问name2,一个访问name3外,其他功能基本相同。如果我添加更多字段,我将不得不添加更多功能。
是否有更好的方法通过单一函数(或其他方式)检索 name2/name3?
我认为更好的方法是先使用库函数找到具有匹配 name1
字段的项目,然后提取所需的字段。
您可以将访问器函数作为参数传递,因此为此您只需要一个函数。
Racket中的示例,但适应"your"方案应该不难:
(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
我这样定义一个结构体
(struct anobject name1 name2 name3)
我创建了包含这些结构的列表
(define list1 (list (anobject name1a name2a name3a)
(anobject name1b name2b name3b)))
然后我想得到给定 name1 的 name2 或 name3 的值。
一种方法是编写 2 个函数
(define (get-name2 name1)
...)
(define (get-name3 name1)
...)
循环遍历列表以查找 name1 与 name1 arg 匹配的结构和 return 我们想要的 属性。
但这2个函数除了一个访问name2,一个访问name3外,其他功能基本相同。如果我添加更多字段,我将不得不添加更多功能。
是否有更好的方法通过单一函数(或其他方式)检索 name2/name3?
我认为更好的方法是先使用库函数找到具有匹配 name1
字段的项目,然后提取所需的字段。
您可以将访问器函数作为参数传递,因此为此您只需要一个函数。
Racket中的示例,但适应"your"方案应该不难:
(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