gpt4 book ai didi

racket - 如何将结构的实例添加到哈希表?我不断收到引用列表

转载 作者:行者123 更新时间:2023-12-05 00:10:36 25 4
gpt4 key购买 nike

我正在写一个简单的小 roguelike 来学习 Racket 。我被困在一些看起来很简单的事情上——使用哈希表创建一个游戏对象工厂。我这样做的典型方法(如在 clojure 或其他人中)是创建一个关键字(如“玩家”并为该类型的游戏对象添加一个对象实例,然后我将根据需要进行克隆。

我显然在这里遗漏了一些基本的东西。对不起,这个简单的问题。

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

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

我不知道为什么我把它作为引用列表。而不是实例化的对象。我觉得我在 (定义上面的对象模板中缺少一些语法糖,但我找不到它。

最佳答案

尝试:

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

问题是 #hash(...)将引用其中的所有内容。使用 hash (或 make-hash 用于可变散列,尽管参数格式不同)如果您想允许评估。

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

关于racket - 如何将结构的实例添加到哈希表?我不断收到引用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56874734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com