【问题标题】:java.lang.String cannot be cast to clojure.lang.IFnjava.lang.String 不能转换为 clojure.lang.IFn
【发布时间】:2017-04-06 19:33:27
【问题描述】:

我正在尝试将一些数据添加到应用引擎数据存储中。这是我的功能

(defn createUser [email phone roleId status]
  (println (db/isIdExist "users" "email" email))
  (if (db/isIdExist "users" "email" email) 
    (str "false")
    ((db/addUser email phone roleId status) (str "true"))))

这里我想根据isIdExist函数的值在正文中打印false(如果电子邮件已经存在则返回true,否则返回false),如果isIdExist == true然后它打印false但是当isIdExist == false它在数据存储中添加了值,但给出了这个错误。有人可以帮忙解释一下为什么会这样吗?我在这里缺少什么clojure概念?谢谢

【问题讨论】:

    标签: clojure clojurescript compojure clojure-java-interop


    【解决方案1】:

    在 Clojure 中 ))))))) 是完全正常的,你到处都能看到它,无需担心。

    另一方面,(( 应该会脱颖而出并引起您的注意。它通常意味着:

    • 有人正在返回一个函数。
    • 应该立即运行该函数。

    这种模式在任何方面都没有错,只是学习发现它是快速习惯阅读 Clojure 代码的有用方法。在这种情况下,这可能意味着打开的(s 太多了

    ((db/addUser email phone roleId status) (str "true"))))
    

    【讨论】:

      【解决方案2】:

      我假设db/addUser 返回一个字符串,在这种情况下,您尝试将返回值作为函数调用。看起来您想要执行插入然后返回“true”,因此您可以使用do 对两者进行排序:

      (if (db/isIdExist "users" "email" email) 
        "false"
        (do
          (db/addUser email phone roleId status) 
          "true"))))
      

      【讨论】:

        猜你喜欢
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多