当前位置:  开发笔记 > 编程语言 > 正文

Clojure"如果"从未评估其第三个论点

如何解决《Clojure"如果"从未评估其第三个论点》经验,为你挑选了2个好方法。

我一直想把这个问题想象一下.

(defn is-decimal [astr]
  (if (. astr (indexOf (int \.)))
    (Double/parseDouble astr)
    (Integer/parseInt astr)))

这就是我写的功能.is-decimal或者传递诸如"2.5"或"5"之类的东西或类似的东西,但它总是使用if第二个参数,而不是第三个参数.我(. astr (indexOf (int \.)))在REPL中测试过,它看起来工作正常,它在失败时返回-1,而在它失败时返回1.我相信这可能是问题所在.-1在Clojure中并不意味着错误.谁能想到解决这个问题的方法?

提前致谢.

编辑:谢谢你的帮助.在我写完之后,我有了一个主意.我编写了一个检查1和-1的谓词函数.正是我需要的.醒来后我不应该直接编码:



1> Brian Carper..:

如果要测试字符串是否包含字符,可以使用正则表达式:

(re-find #"\." astr)

要么:

(some #(= \. %) astr)

要么:

(contains? (into #{} astr) \.)

或者你可以使用includes?从clojure.contrib.seq-utils的它做这件事的.

Clojure已经有一个知道如何区分整数和双精度的读者,所以如果你确定你的字符串中只有数字,你就可以使用它.(但要小心,这会读取任何内容,而不仅仅是数字.这有潜在的危险.如果你的字符串有可能不是数字,请不要使用它.)

注意,Clojure还处理整数太大而不能满足本机int而不会溢出的情况.如果要解析整数,可能需要查看bigint函数而不是parseInt.

user> (class (read-string "2.5"))
java.lang.Double
user> (class (read-string "2"))
java.lang.Integer
user> (class (read-string "2000000000000"))
java.math.BigInteger

如果你的函数是谓词,那么在Clojure中通常命名它decimal?而不是is-decimal.你的函数实际上更像是一个数字解析器,所以我个人称之为parse-number或者string-to-number.


Clojure备忘单也非常有用:http://clojure.org/cheatsheet

2> Dan..:

未经测试:

(if (> 0 (. astr (indexOf (int \.))))

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有