【发布时间】:2014-11-11 21:19:06
【问题描述】:
我正在学习 Kotlin,作为学习的一部分,我想设计一个代表有理数的类,要求:
- 类应包含两个不可变整数字段:分子和分母。
- 类应包含有效的 equals、hashCode 和 toString 实现。
- 类初始化时,分子和分母应被其GCD删除(即
Ratio(1, 2) == Ratio(2, 4 /* or 4, 8 */) or Ratio(2, 4 /* or 4, 8 */).numerator == 1, .denominator == 2等) - 此类应包含 mul 方法,该方法采用另一个比率并返回当前比率与给定比率的乘法结果。
我尝试使用看起来适合该任务的数据类,但我无法定义自定义构造函数(分子和分母都需要删除到它们的 GCD)。
可能的解决方案:
class Ratio(num : Int, denom : Int) {
val numerator = num / gcd(num, denom)
val denominator = denom / gcd(num, denom) // GCD calculated twice!
}
定义类构造函数以便计算一次 GCD 的最简单方法是什么?
更新
好的,看来我找到了可能的解决方案:
data class Ratio(num : Int, denom : Int) {
val numerator : Int
val denominator : Int
{
val gcd = calcGcd(num, denom)
numerator = num / gcd
denominator = denom / gcd
}
}
但它使数据限定符变得无用 - 在此更改之后,Ratio 类不再自动生成 equals/hashCode/toString。
在最新版本的 Kotlin - 0.9.66 上验证
重现该行为的程序:
data class Ratio(num : Int, denom : Int) {
val numerator : Int
val denominator : Int
{
val gcd = BigInteger.valueOf(num.toLong()).gcd(BigInteger.valueOf(denom.toLong())).intValue();
numerator = num / gcd;
denominator = denom / gcd
}
}
data class Ratio2(val num : Int, val denom : Int)
fun main(args: Array<String>) {
println("r = " + Ratio(1, 6).toString())
println("r2 = " + Ratio2(1, 6).toString())
}
输出:
r = Ratio@4ac68d3e
r2 = Ratio2(num=1, denom=6)
很明显,Ratio 不再具有自动生成的 toString 方法
【问题讨论】:
-
您是否向 JetBrains 报告了无用的
data问题?听起来像一个错误
标签: kotlin