내가 코 틀린를 공부하고 학습의 일환으로 나는 유리수, 요구 사항을 나타낼 것이다 클래스 설계 할 :Kotlin 개체를 초기화하는 동안 임시 변수를 저장하는 방법은 무엇입니까?
- 클래스는 두 개의 불변의 정수 필드를 포함해야합니다 : 분자와 분모를.
- 클래스에는 유효한 equals, hashCode 및 toString 구현이 포함되어야합니다. 클래스가 초기화되면
- , 분자와 분모가 GCD 삭제되어야한다
- 이 클래스는 다른 비율을 얻어 현재 비율과 주어진 하나의 승산 결과를 반환 MUL 방법을 포함한다 (이는
Ratio(1, 2) == Ratio(2, 4 /* or 4, 8 */) or Ratio(2, 4 /* or 4, 8 */).numerator == 1, .denominator == 2
등을 의미) .
데이터 클래스를 사용하여 해당 작업에 적합한 것으로 보았습니다. 그러나 사용자 지정 생성자를 정의하지 못했습니다 (분자와 분모를 GCD로 삭제해야 함).
가능한 해결 방법 :
class Ratio(num : Int, denom : Int) {
val numerator = num/gcd(num, denom)
val denominator = denom/gcd(num, denom) // GCD calculated twice!
}
GCD 한 번 계산되도록 클래스 생성자를 정의하는 가장 간단한 방법은 무엇입니까? 나는 가능한 솔루션을 찾을처럼
OK UPDATE, 그것은 보지 않는다 :
data class Ratio(num : Int, denom : Int) {
val numerator : Int
val denominator : Int
{
val gcd = calcGcd(num, denom)
numerator = num/gcd
denominator = denom/gcd
}
}
을하지만 데이터가 쓸모 한정자 것을 렌더링 -이 변경 비율 클래스가 더 이상 자동 등호를 생성 한 후/해시 코드/toString.
코 틀린의 최신 버전에 검증 - 그 동작을 재현 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 = [email protected]
r2 = Ratio2(num=1, denom=6)
비율이 더 이상 자동으로 생성 한 것이 분명 없다 toString 메서드
당신은 쓸데없는'데이터 '문제를 JetBrains에보고 했습니까? 버그처럼 들린다 –