[英]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匹配的結構,並返回我們想要的屬性。
但是這兩個功能基本上是相同的,除了一個訪問name2,另一個訪問name3。 如果添加更多字段,則必須添加更多功能。
有沒有一種更好的方法可以通過單個函數檢索name2 / name3(或其他方法)?
我認為更好的方法是先使用庫函數查找具有匹配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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.