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

Ray*_*yne 7 clojure

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

(defn is-decimal [astr]
  (if (. astr (indexOf (int \.)))
    (Double/parseDouble astr)
    (Integer/parseInt astr)))
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

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

Bri*_*per 10

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

(re-find #"\." astr)
Run Code Online (Sandbox Code Playgroud)

要么:

(some #(= \. %) astr)
Run Code Online (Sandbox Code Playgroud)

要么:

(contains? (into #{} astr) \.)
Run Code Online (Sandbox Code Playgroud)

或者你可以使用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
Run Code Online (Sandbox Code Playgroud)

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

  • Clojure备忘单也非常有用:http://clojure.org/cheatsheet (2认同)

Dan*_*Dan 6

未经测试:

(if (> 0 (. astr (indexOf (int \.))))
Run Code Online (Sandbox Code Playgroud)