4

ラケットでオブジェクトのすべてのフィールドを同時に取得することは可能ですか?

基本的に、オブジェクトをキーとしてフィールド名、値としてフィールド値を持つハッシュテーブルに変換したいと思います。

関数(field-names 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
4

1 に答える 1

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から脆弱性の低いものに変更することもできますが、ニーズに十分に対応できます。クラス情報と一般的な検査官について読んでください。

于 2012-09-05T16:23:11.913 に答える