首页 > 解决方案 > clojure 读取字符串分数/比率令人惊讶地工作

问题描述

有人问我如何在 Clojure 中解析字符串“1/4”。我回复了以下内容(可能有更好的方法):

(-> "1/25"
  (str/split #"/")
  (->> (map #(Integer/parseInt %))
       (apply /)))

但后来我想我会看看 read-string 做了什么(我在安全的时候用它来解析),令人惊讶的是:

(read-string "1/25")

返回一个clojure.lang.Ratio.

我根本没想到它能够阅读表达式。谁能解释为什么这有效?

标签: clojure

解决方案


两者都是 EDN 规范clojure.core/readclojure.edn/read“超集”。它们支持所有有效的 EDN 和其他一些扩展(例如,比率)

clojure.core/read可以评估代码。例如(read-string "#=(prn :hello-injection)"),所以更喜欢clojure.edn/read-string解析输入

AFIK,cljs.core/read-string不会读取比率。你也不能1/2.cljs文件中使用。


推荐阅读