Object 获取对象的所有字段

Object 获取对象的所有字段,object,field,racket,Object,Field,Racket,在球拍中是否可能同时获得一个物体的所有区域 我基本上希望将一个对象转换为一个哈希表,其中字段名作为键,字段值作为值 我找到了一个函数(字段名obj),但是我不知道如何使用返回的字段名从obj获取值。函数get field可用于获取字段的值,但我不知道如何将其与值一起使用: > (define x% (class object% (init-field x y) (super-new))) > (define obj (make-object x% 1 2)) > (get-fi

在球拍中是否可能同时获得一个物体的所有区域

我基本上希望将一个对象转换为一个哈希表,其中字段名作为键,字段值作为值

我找到了一个函数(字段名obj),但是我不知道如何使用返回的字段名从obj获取值。函数
get field
可用于获取字段的值,但我不知道如何将其与值一起使用:

> (define x% (class object% (init-field x y) (super-new)))
> (define obj (make-object x% 1 2))
> (get-field x obj)
1
> (field-names obj)
'(y x)
> (define field-name (second (field-names obj)))
> field-name
'x
> (get-field field-name obj)
get-field: given object does not have the requested field
  field name: field-name
  object: (object:x% ...)
  errortrace...:
  context...:
    /usr/lib/racket/collects/racket/private/class-internal.rkt:4906:0: obj-error29
    /usr/lib/racket/collects/racket/private/misc.rkt:87:7

这里有一些代码可以帮助您开始

#lang racket

> (define x% (class object% (inspect #f) (init-field x y) (super-new)))
> (define obj (make-object x% 1 2))
> (let-values (((name field-cnt field-name-list field-accessor field-mutator super-class skipped) 
               (class-info x%)))
    (for/hash ((name field-name-list)
               (idx field-cnt))
      (values name (field-accessor obj idx))))
'#hash((x . -1) (y . 0))

您可能希望将inspector从#f更改为不易受攻击的,但足够开放以满足您的需要。阅读课堂信息和检查人员的一般情况。

检查人员的问题充其量也很棘手。没有真正的文档和/或良好实践的用例/模式。