【问题标题】:Clojure: returning a vector from an anonymous functionClojure:从匿名函数返回向量
【发布时间】:2011-02-07 12:57:13
【问题描述】:

我编写了一个小型匿名函数,用于map 调用。该函数返回一个向量,其中包含来自 SQL 结果集查询的列名和列值。

这里是函数(输入是列名):

(fn [name] [(keyword name) (.getObject resultset name)])

这很好,但是当我尝试使用匿名函数的“简化”版本时,我收到了一个错误:

#([(keyword %) (.getObject resultset %)])

java.lang.IllegalArgumentException: Wrong number of args (0) passed to: PersistentVector

这里是map 电话:

(into {} (map (fn [name] [(keyword name) (.getObject resultset name)]) column-names))

这个函数可以使用简化的语法吗?如果有,怎么做?

谢谢。

【问题讨论】:

标签: clojure anonymous-function


【解决方案1】:

您的问题是简单的语法试图将向量评估为函数调用。

您可以插入一个“身份”函数来使其工作,因为这只是一个简单的函数,它将返回不变的向量:

#(identity [(keyword %) (.getObject resultset %)])

【讨论】:

  • 我选择了这个答案,因为它也解释了问题发生的原因,尽管 Alex Ott 的答案也有效(并为其他数据结构提供了通用解决方案)。谢谢大家。
  • 我编辑了这个答案以纳入亚历克斯的建议,但它看起来由于某种原因被忽略了。哦,好吧。
  • 我添加了一个更理想解决方案的示例,而不仅仅是显示代码来说明它为什么不起作用。由于您编辑没有采取。
  • 使用#(do [(keyword %) (.getObject resultset %)]) 比使用identity 更短并且可能快一点
【解决方案2】:

您需要使用 vector 函数来执行此操作:

#(vector (keyword %) (.getObject resultset %))

附:还有地图、集合等功能。

【讨论】:

    【解决方案3】:

    是的,Clojure 应该真的支持 #[...] 构造,就在这种情况下。

    我会推荐以下作为最佳选择:

    #(vector (keyword %) (.getObject resultset %))
    

    【讨论】:

    • 我不认为 #[...] 足够普遍,不足以保证它的特殊语法,一旦你了解它,把vector 扔进去没什么大不了的。
    • 我想到了同样的#[...] 构造。我怎么能为它写一个宏? # 表示阅读器宏对吗?
    • 你可以写#(-> [(keyword %) (.getObject resultset %)]),但我觉得这个不清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    相关资源
    最近更新 更多