使用自动类型字段转换列出结构转换

问题描述 投票:1回答:2

我正在阅读.csv文件和

(define-struct my-struct (id name))
(apply my-struct '("5" "Tomas"))
(string? (my-struct-id (apply my-struct '("5" "Tomas"))))

将其转换为struct。所有字段都是字符串,但有一些优雅的方式如何强制string->number转换例如id场?

非常感谢。

racket
2个回答
3
投票

我认为有两种选择。第一个是最简单的,使用自定义的构造函数:

; Option 1: Make a dedicated constructor that
;           handles the conversion.
(struct my-struct (id name) #:transparent)
(define (create-struct id name)
  (my-struct (string->number id) name))

第二种选择是(ab)使用警卫:

; Option 2: Use a guard
(define (converter id name the-struct-name)
  (values (string->number id) name))
(struct my-second-struct (id name) #:guard converter #:transparent)

(apply my-second-struct '("5" "Tomas"))

2
投票

要完成soegaard的答案,如果您提供结构并在其他模块中使用它,您还可以添加合同以防止错误使用:

#lang racket/base
(require racket/contract)
(provide (contract-out
          [struct person ((id number?) (name string?))]))

(struct person (id name))
> (require my-module/person)
> (person 42 "Margaret")
#<person>
> (person "haxxor" 1337)
; person: contract violation
;   expected: number?
;   given: "haxxor"
;   in: the 1st argument of
;       (-> number? string? person?)

请参阅此处的完整文档:https://docs.racket-lang.org/guide/contracts-struct.html#(part._contracts-define-struct)

© www.soinside.com 2019 - 2024. All rights reserved.