【问题标题】:Clojure, return arguments from a function that are then used directly in a hash-mapClojure,从函数返回参数,然后直接在哈希映射中使用
【发布时间】:2015-10-04 19:50:52
【问题描述】:

我想从函数返回参数列表,并将它们直接放入哈希映射中。我使用一个向量来包含这些参数,假设 Clojure 函数只能返回一个值。所以在调用的返回部分,我想去掉向量。

这是函数成功返回的内容:

[:top-edge {3 [[0 0]]}]

正如你所看到的,如果你去掉向量,你会得到一些应该能够直接放入哈希映射的东西(因为它有一个键和一个值):

:top-edge {3 [[0 0]]}

我用applyflatten做过实验,知道在某些情况下concat可以用来剥离最外层的向量,但还是没有找到解决办法。

目前我已经留下了代码,所以它不会剥离矢量,错误消息非常有意义:java.lang.IllegalArgumentException: No value supplied for key: [:top-edge {3 [[0 0]]}]

编辑: 问题已经回答,但只是为了显示实际代码以及什么有效和无效。这确实有效:

(conj {:rep (->Blob rgb pos)} (new-edge-map pos edge-keyword seg-id)) 

,而这不是:

{:rep (->Blob rgb pos) (apply hash-map (new-edge-map pos edge-keyword seg-id))}

我得到的错误是“地图文字必须包含偶数个表单”。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    你可以使用conj:

    (conj {} [:top-edge {3 [[0 0]]}])
    

    【讨论】:

      【解决方案2】:

      来自hash-map的文档:

      使用提供的映射返回一个新的哈希映射。如果有任何键
      相等,就好像通过重复使用 assoc 来处理它们。

      所以,

      (apply hash-map [:top-edge {3 [[0 0]]}])
      => {:top-edge {3 [[0 0]]}}
      

      【讨论】:

      • 我试过这样使用:{:a-key "a value" (apply hash-map (a-call an-arg))},其中(a-call an-arg) 可以替换为[:top-edge {3 [[0 0]]}],并得到“地图文字必须包含偶数个表单”。
      • 问题是你有{:a-key "a value" a-hash-map-which-is-also-a-key}并且第二个键没有值。
      • 我也尝试了其他一些方法,但也无法让它们正常工作。 (conj {:a-key "a value"} [:top-edge {3 [[0 0]]}]) 确实有效。
      • (apply hash-map (a call an-arg)) 如果(a-call an-arg) 返回一个包含两个元素的向量,如您所描述的那样,则应该可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      相关资源
      最近更新 更多