我正在阅读.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
场?
非常感谢。
我认为有两种选择。第一个是最简单的,使用自定义的构造函数:
; 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"))
要完成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)