2024 Clojure 问卷调查! 中分享您的想法。

欢迎!请参见 关于 页面了解更多相关信息。

+1 投票
Clojure

可能很简单,但我是 Clojure 新手,无法解决这个问题。

为什么它无法评估并引发错误?
clojure.lang.ExceptionInfo: 无法解析符号: defstruct

(ns StructMaps)

(defn Pets
  []
  (defstruct pets :PetType :PetName)
  (def myPet (struct pets "dog" "Fido"))
  (println myPets)
  )

(Pets)

感谢有用的回答!

我不知道为什么人们还在使用 defstruct,而 defrecord 已经有了。我很想知道是什么促使你做出这个选择。
我猜:提问者可能遵循了 TutorialsPoint Clojure 教程:[这里](https://www.tutorialspoint.com/clojure/clojure_struct.htm) 或 Udemy Clojure:The Complete Beginner's Guide 2023 [这里](https://www.udemy.com/course/clojureprogramming/),两者都很糟糕。
可能也值得提及的还有

CamelCase 不符合 Clojure 绑定的习惯用法,所以我们通常使用 (ns struct-maps), (defn pets ...), (def my-pet ...), 等等。对于类似“类型”名称或底层生成 Java 类的情况,我们会使用 CamelCase。

def(以及其他def*条目)创建顶级定义,这样我们就不在函数内部使用它们。如果你正在跟随一个做这样的事情的教程,那么这是一个糟糕的教程,你应该停止跟随它,找到更好的东西。

如其他人所指出,结构体已经弃用了很长时间,尽管存在记录作为现代的替代品,但我们通常使用简单的哈希映射——这是来自静态类型面向对象编程语言(例如Clojure)时你需要习惯的事情:Clojure大部分时间是关于普通数据的。

1 个回答

0

我无法再现这个问题,除了在运行clj -M StructMaps.clj时有一个拼写错误:myPet可能应该是myPets

...