簡體   English   中英

從clojure map中的動態鍵獲取值

[英]get value from dynamic key in clojure map

我有一張clojure地圖

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

我需要從一個動態的關鍵變量environment中獲取一個值。

像下面的東西拋出異常,

+  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) names)不是有效表格。 除非environment是沒有參數的函數,否則在將其包裝到parens中時會出錯。 用法:創建關鍵字是在讀取時,在評估(environment)之前完成的,因此您沒有看到上一個錯誤,並且讀者嘗試解決:它自己,這不是讀者的有效輸入。

(keyword(":" env) names)嘗試調用字符串“:”,就像它是一個函數一樣。 它不是一個。 間距也讓我相信,你希望keyword(arg)能像Algol家族語言一樣工作。 它不會。 正確的用法是(keyword 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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM