【问题标题】:Error while defining map in clojure在 clojure 中定义地图时出错
【发布时间】:2017-07-05 10:28:14
【问题描述】:

我是新的 clojure,在运行此代码时无法理解确切的问题

(def my-map {name "Srini" empid "10000"})

收到此错误:

CompilerException java.lang.RuntimeException: Unable to resolve symbol: empid in this context, 正在编译:(/Users/srini/Downloads/clojureexample/my-stugg/src/my_stugg/corecomponents.clj:95:1)

(def my-map {name "Srini" :empid "10000"})

运行成功。

我在第一行做错了什么?

(def my-map {name "Srini" empid "10000"})

【问题讨论】:

  • name 是来自核心的 clojure 函数。您希望在地图中一直使用关键字。
  • @cfrick 你的意思是地图键应该是关键字(:)?
  • 是的。 Clojure 允许您创建以符号和变量作为键的映射,但大多数时候这不是您想要的。
  • @cfrick 当我运行这段代码时,同样的问题来了 (def my-map {flower1 :flower1 flower2 :flower2})
  • @cfrick 我看不出此代码有任何问题(let [{flower1 :flower1 flower2 :flower2} {:flower1 "red" :flower2 "blue"}] (str "The flowers are " flower1 " and " flower2))

标签: clojure


【解决方案1】:

Clojure 正在尝试解析 empid 并且无法解析,因此它返回错误。

Clojure 允许您使用几乎所有内容作为键来定义映射。这包括非常常见的关键字和字符串,还包括符号、函数、数字、向量和其他映射等数据结构等。

您的示例包含一个有效映射,即绑定到name 的函数映射到字符串“Srini”。但是,其他映射无效,因为empid 没有绑定到任何东西。

最常见的情况是为您的键使用关键字,这具有允许通过关键字以安全(非NullPointerException-causing)方式访问值的特殊优势:

(:name {:name "Srini" :empid 10000})
=> "Srini"

因此,虽然在某些情况下您可能希望将函数映射到某个东西,但这显然不适合您。 (顺便说一句,字符串作为关键字在从数据已经是字符串的文件或数据库中读取时特别有用,并且与关键字相互转换没有任何优势。

【讨论】:

    【解决方案2】:

    您可能希望将键更改为关键字。在 Clojure 中,关键字在字符串前面用冒号书写,但您不需要引号(只要您的关键字中没有空格,但我们不要变得复杂)。

    我建议简单地开始:

    (def my-map {:name "george"})

    这将创建一个包含单个键和值的映射。

    如果你想使用 let,就这样做吧:

    (let [my-map {:name "george"}] my-map)

    更新:嗯,你的问题似乎有点改变了!我仍然真的建议从简单的开始。

    name 已经在 clojure 中定义为一个函数(它获取符号或关键字的字符串版本),所以你不应该使用它。如果您想创建一个键,请使用:name,除非您想在 let 绑定中隐藏名称“name”,但这与映射中的键无关。

    我觉得也许你需要学习地图的基础知识,然后在你对示例发疯之前先放手。坚持简单的事情,并确保您的钥匙不是符号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2014-10-07
      • 2012-08-29
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多