如何将结构实例添加到哈希表?我不断取得引用清单

时间:2019-07-03 16:44:50

标签: racket

我正在写一个简单的小流氓来学习球拍。我被困在看似很简单的事情上-使用哈希表创建游戏对象工厂。我执行此操作的典型方式(如clojure或其他方法)是创建一个关键字(如“ player”),并为该类型的游戏对象添加一个对象实例,然后根据需要进行克隆。

我显然在这里缺少一些基本知识。很抱歉这个简单的问题。

我尝试了创建哈希表的多个版本。我使它起作用的唯一方法是简单地将属性放在哈希列表中,而不是通过apply使用struct-copy。但是,当将它们的嵌套结构嵌套在基本结构中时,这不能很好地工作。

;racket
#lang racket

(struct loc (x y) #:transparent)
(struct object (rep color loc) #:transparent)
(struct world (player running) #:transparent)

(define object-templates 
  #hash(["player" . (object "@" "green" (loc 0 0))]))

(define (make-object type) (struct-copy object (dict-ref object-templates type)))


; struct-copy: contract violation
;   expected: object?
;   given: '(object "@" "green" (loc 0 0))

我不知道为什么要将此作为报价单。而不是实例化的对象。我感觉好像在(上面的定义对象模板中)缺少一些语法糖,但是我一直找不到它。

1 个答案:

答案 0 :(得分:6)

尝试:

(define object-templates 
  (hash "player" (object "@" "green" (loc 0 0))))

问题在于#hash(...)将引用其中的所有内容。如果要允许求值,请使用hash(或make-hash用于可变哈希,尽管参数格式不同)。

这类似于'(object) vs (list object),或#(object) vs (vector object),等等。