例如,我有两个结构实例s1
和s2
,但我不知道s1
和s2
的确切类型。是否可以检查s1
和s2
是否具有相同的结构类型?
答案 0 :(得分:4)
球拍 - #lang racket
,主要/完整语言 - 不有type-of
或class-of
。
相反,你可以使用object-name
:
#lang racket
(struct s ())
(struct t ())
(define x (s))
(define y (s))
(define z (t))
(object-name x) ; 's
(object-name y) ; 's
(object-name z) ; 't
(equal? (object-name x) (object-name y)) ; #t
(equal? (object-name x) (object-name z)) ; #f
答案 1 :(得分:4)
通常不可能检查该属性,即因为Racket中的结构通常是 opaque ,这意味着反射操作会为您提供有关结构实例的有限信息或无信息。
但是,如果结构类型声明为 transparent ,则可以使用struct-info
确定它们是否源自相同的结构类型。
#lang racket
(struct s () #:transparent)
(struct t () #:transparent)
(define-values (s-info _) (struct-info (s)))
(define-values (t-info _) (struct-info (t)))
(equal? s-info t-info) ; => #f
(define-values (s-info-2 _) (struct-info (s)))
(equal? s-info s-info-2) ; => #t
如果您只想获得此信息的近似值,可以按照Greg的建议并使用object-name
。请注意,两个不生成等效实例的结构类型可能具有相同的对象名称:
(define s1 (let () (struct s ()) (s)))
(define s2 (let () (struct s ()) (s)))
(equal? (object-name s1) (object-name s2)) ; => #t
答案 2 :(得分:0)
(原始问题不仅限于球拍)
使用type-of
:
(eq (type-of s1) (type-of s2))
您也可以使用class-of
代替;它对结构无关紧要,但对其他类型无关紧要;你需要仔细考虑你想要做什么。 type-of
更精细,但可能无法返回atom
,因此您可能无法使用eq
。
编辑:它似乎也是racket has class-of
,所以你可以使用它。