我正在写一个简单的小roguelike学习球拍。我被困在看似很简单的事情上-使用哈希表创建游戏对象工厂。我执行此操作的典型方式(如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))
Run Code Online (Sandbox Code Playgroud)
我不知道为什么要把它作为报价单。而不是实例化的对象。我感觉好像在上面的(定义对象模板)中缺少一些语法糖,但是我一直找不到。
尝试:
(define object-templates
(hash "player" (object "@" "green" (loc 0 0))))
Run Code Online (Sandbox Code Playgroud)
问题在于#hash(...)它将引用其中的所有内容。如果要允许求值,请使用hash(或make-hash用于可变哈希,尽管参数格式不同)。
这类似于'(object)vs (list object)或#(object)vs (vector object)等。