gpt4 book ai didi

dictionary - 从 clojure 映射中的动态键获取值

转载 作者:行者123 更新时间:2023-12-02 00:10:42 26 4
gpt4 key购买 nike

我有一个 Clojure map

+  69 (def names {:production "prayag"                                                                     
+ 70 :staging "upd"})

我需要从动态的关键变量环境获取一个值。

类似下面的东西会抛出异常,

+  72 (defn get-name [environment]                                                                                   
+ 73 (let [
+ 74 name (:(environment) names)]
+ 75 println name
+ 76 ))

堆栈跟踪

Caused by: java.lang.RuntimeException: Invalid token: :
at clojure.lang.Util.runtimeException(Util.java:219)
at clojure.lang.LispReader.interpretToken(LispReader.java:326)
at clojure.lang.LispReader.read(LispReader.java:211)
at clojure.lang.LispReader.readDelimitedList(LispReader.java:1157)
at clojure.lang.LispReader$ListReader.invoke(LispReader.java:982)
at clojure.lang.LispReader.readDelimitedList(LispReader.java:1148)
at clojure.lang.LispReader$VectorReader.invoke(LispReader.java:1083)
at clojure.lang.LispReader.readDelimitedList(LispReader.java:1148)
at clojure.lang.LispReader$ListReader.invoke(LispReader.java:982)
at clojure.lang.LispReader.readDelimitedList(LispReader.java:1148)
at clojure.lang.LispReader$ListReader.invoke(LispReader.java:982)
at clojure.lang.LispReader.read(LispReader.java:185)
at clojure.lang.Compiler.load(Compiler.java:7060)
... 55 more

在执行代码时,

+  72 (defn get-name [env]                                                                                    
+ 73 (let [
+ 74 name (keyword(":" env) names)]
+ 75 println name
+ 76 ))

给予

Caused by: java.lang.ClassCastException: java.lang.String cannot be cast to clojure.lang.IFn
at nepleaks_engine.util.utility$fn__3885.invoke(utility.clj:74)
at clojure.lang.AFn.applyToHelper(AFn.java:159)
at clojure.lang.AFn.applyTo(AFn.java:151)
at clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:3458)
... 58 more

+  72 (defn get-name [env]                                                                                    
+ 73 (let [
+ 74 name (.get names env)]
+ 75 println name
+ 76 ))

给出

java.lang.NullPointerException
at nepleaks_engine.util.utility$util.invoke(utility.clj:81)
at nepleaks_engine.core$_main.invoke(core.clj:14)
at clojure.lang.Var.invoke(Var.java:411)
at user$eval5$fn__7.invoke(form-init336568295343421746.clj:1)
at user$eval5.invoke(form-init336568295343421746.clj:1)
at clojure.lang.Compiler.eval(Compiler.java:6619)
at clojure.lang.Compiler.eval(Compiler.java:6609)
at clojure.lang.Compiler.load(Compiler.java:7064)
at clojure.lang.Compiler.loadFile(Compiler.java:7020)
at clojure.main$load_script.invoke(main.clj:294)
at clojure.main$init_opt.invoke(main.clj:299)
at clojure.main$initialize.invoke(main.clj:327)
at clojure.main$null_opt.invoke(main.clj:362)
at clojure.main$main.doInvoke(main.clj:440)
at clojure.lang.RestFn.invoke(RestFn.java:421)
at clojure.lang.Var.invoke(Var.java:419)
at clojure.lang.AFn.applyToHelper(AFn.java:163)
at clojure.lang.Var.applyTo(Var.java:532)
at clojure.main.main(main.java:37)

最佳答案

(:(环境)名称) 不是有效的形式。除非 environment 是一个没有参数的函数,否则将其括在括号中将会出现错误。使用 : 创建关键字是在读取时完成的,在评估 (environment) 之前,因此您不会看到之前的错误,并且读者会尝试解决 : 本身,这对读者来说不是有效的输入。

(keyword(":"env) names) 尝试调用字符串“:”,就好像它是一个函数一样。它不是一个。另外,空格让我相信您希望 keyword(arg) 能够像在 Algol 系列语言中一样工作。它不会。正确的用法是(关键字arg)

这是可行的,为了方便起见,可以使用一些等效的语法(它们都做同样的事情):

user> (def names {:production "prayag" :staging    "upd"})
#'user/names
user> (def environment "staging")
#'user/environment
user> (names (keyword environment))
"upd"
user> ((keyword environment) names)
"upd"
user> (get names (keyword environment))
"upd"

关于dictionary - 从 clojure 映射中的动态键获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24003972/

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