簡體   English   中英

列表中結構字段的獲取器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM