簡體   English   中英

可選的struct字段

[英]Optional struct field

我搜索了Racket(語言;非類型)的文檔 ,並且無法確定是否可以為非可變結構提供可選參數。 我希望能夠做到:

(struct q-a-website (name interest-value #syntax? some-optional-field))
... (q-a-website "stack-overflow" 42 "My name is Jon Skeet") ...
... (q-a-website "quora" -inf.0) ...

在這個偽示例中, #syntax? 只是一個占位符,我懷疑可能存在一些特殊語法,以使以下字段可選。 有沒有辦法讓你的日常,不可變,一般的結構在基礎Racket中有可選參數?

澄清:如果在沒有可選參數的情況下創建結構,則使用必須在創建時提供的默認值填充該結構。 在這種情況下,該信息必須包含在(可能名稱#syntax?#syntax? 塊。

(注意:我對這個問題中包含struct標簽有所保留,因為它提到了Racket不屬於的C語言系列......)

我認為最簡單的方法就是創建一個具有可選參數的“構造函數”,如下所示:

#lang racket

(struct q-a-website (name interest-value optional-field))

;; make a q-a-website
(define (make-q-a-website name interest-value [optional-field #f])
  (q-a-website name interest-value optional-field))

;; try making it with and without the optional argument:
(make-q-a-website "stack-overflow" 42 "My name is Jon Skeet")
(make-q-a-website "quora" -inf.0)

Racket還有一個完整的類系統,幾乎可以想象的一切。 但是,對於這個用途,我想我就是這樣做的。

如果可選字段的默認值有意義,那么我會按照他在評論中建議的那樣做 - 只需定義一個自定義構造函數:

(struct s (a b opt))

(define (make-s a b [opt #f])
  (s a b opt))

(make-s "a" "b")
(make-s "a" "b" "opt")

但是,如果opt的默認值實際上意味着N / A,那么我可能會改為定義兩個struct :一般情況,以及從特殊情況派生的專用結構:

(struct general (a b))
(struct special general (opt))

(define g (general "a" "b"))
(define s (special "a" "b" "opt"))

只知道/關心general可以處理generalspecial實例:

(general? g) ; #t
(general? s) ; #t

專門關注special代碼可以檢查:

(special? g) ; #f
(special? s) ; #t

我可能只會做一個真正的“is-a”(“是一種”)關系 - 如果說“ special 是一種 general ”聽起來很自然。


當然,如果你真的進入這種OOP領域,你可以使用racket/class

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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