因为比值的值约化成最简形式,对于最简形式是 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?