【问题标题】:Optional struct field可选结构字段
【发布时间】:2014-02-20 21:34:52
【问题描述】:

我在documentation 中搜索了 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? 块内。

(注意:我对在此问题中包含 struct 标记持保留态度,因为它提到了 Racket 不属于的 C 语言系列......)

【问题讨论】:

  • 你能澄清一下你想要的语义吗?例如:当您为没有它的结构请求可选字段时会发生什么?我想我只是建议一个自定义的“构造函数”,但我们会看到......
  • 和约翰一样的想法。还要考虑继承。
  • @JohnClements 我不确定您在问什么,但我正在寻找在未提供字段时创建的默认值。我将编辑我的问题。

标签: struct racket


【解决方案1】:

我认为最简单的方法是创建一个具有可选参数的“构造函数”,如下所示:

#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 还有一个成熟的职业系统,拥有...几乎所有你能想象到的东西。不过,对于这个用途,我想我会这样做。

【讨论】:

  • 好吧,这是一个奇怪的时机。我写了答案,然后进行了一次编辑……然后注意到您也发布了答案。我赞成。 :)
  • 这是我怀疑的正确方向。不过我不知道[optional-field #f] 选项。谢谢。
  • 如果您的struct 中有很多字段,并且您希望它们中的大多数是可选的,您可能希望使用keyword arguments 而不是构造函数的可选参数。
【解决方案2】:

如果可选字段的默认值是有意义的,那么我会按照 John 在他的评论中建议的去做——只需定义一个自定义构造函数:

(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,那么我可能会改为定义两个 structs:一般情况,以及从特殊情况派生的专门情况:

(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”(“is a kind of”)关系这样做——如果说“special is a kind of”听起来很自然的话是一种 general"。


当然,如果你真的要进入这种 OOP 领域,你可以使用racket/class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-16
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多