2012-09-05 3 views
4

Возможно ли в ракетке получить все поля объекта одновременно?получить все поля объекта

Я хотел бы в основном преобразовать объект в хэш-таблицу с именами полей в качестве ключей и значений полей в качестве значений.

Я нашел функцию (имена полей 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 

ответ

6

Вот код, чтобы вы начали

#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)) 

Вы можете изменить инспектора с #f на нечто менее уязвимое, но достаточно открытое для ваших нужд. Прочитайте информацию о классе и инспекторов в целом.

+0

Эта вещь на инспекторах сложна в лучшем случае. Нет реальных документов и/или примеров использования/образцов для передового опыта. –

Смежные вопросы