因为比率值会化简为最简形式,并且对于最低项为 N/1 的整数值,会自动转换为 BigInt(以前是 Long),所以目前的 {{clojure.core/numerator}} 和 {{clojure.core/denominator}} 的行为产生意外的结果。
`
user=> (numerator 1/3)
1
user=> (numerator (+ 1/3 2/3))
ClassCastException clojure.lang.BigInt 无法转换为 clojure.lang.Ratio,在 clojure.core/numerator (core.clj:3306)
user=> (denominator 1/3)
3
user=> (denominator (+ 1/3 2/3))
ClassCastException clojure.lang.BigInt 无法转换为 clojure.lang.Ratio,在 clojure.core/denominator (core.clj:3314)
user=>
`
不支持整型类型上的分子和分母会导致混淆,因为这要求您在调用之前总是检查 ratio?。
建议: 扩展分子和分母的功能,使其也能在整型类型(long, BigInt, BigInteger)上工作,通过路由到 Numbers 类的过载方法。
补丁: clj-1435.patch
审核人: Alex Miller
Rich 的审核问题
- 分子和分母被标记为返回 java.math.BigInteger(而不是 clojure.lang.BigInt),我在补丁中也是这样做的。不过,也许应该是 BigInt?我没有确定决策依据。
- 分子和分母应该接受 BigInteger 和 BigInt 吗?