gpt4 book ai didi

kotlin - Kotlin 中的运算符重载以及此代码如何工作?

转载 作者:行者123 更新时间:2023-12-03 09:00:33 24 4
gpt4 key购买 nike

我正在阅读教程中的以下代码,但我并没有真正理解它。基本上它尝试使用运算符重载,以便以下代码可以工作:

return today + YEAR * 2 + WEEK * 3 + DAY * 5  

我的理解:
这部分:

operator fun MyDate.plus(timeInterval: TimeInterval): MyDate {   
return addTimeIntervals(timeInterval, 1)
}

增强类MyDate以支持带有timeInterval+,因此这将适用于myDate + YEAR示例。

这部分:

operator fun MyDate.plus(timeIntervals: RepeatedTimeInterval) 
= addTimeIntervals(timeIntervals.timeInterval, timeIntervals.number)

增强类MyDate以支持带有RepeatedInterval*

这部分只是声明了一个空类,有 2 个成员变量 timeIntervalnumber

class RepeatedTimeInterval(val timeInterval: TimeInterval, val number: Int)  

我不明白的是乘法实际上是如何发生的,因为 RepeatedInterval 只是一个空类。我该如何理解这一点?

import TimeInterval.*  

data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int)

enum class TimeInterval { DAY, WEEK, YEAR }

operator fun MyDate.plus(timeInterval: TimeInterval): MyDate {
return addTimeIntervals(timeInterval, 1)
}

class RepeatedTimeInterval(val timeInterval: TimeInterval, val number: Int)
operator fun TimeInterval.times(number: Int) = RepeatedTimeInterval(this, number)



operator fun MyDate.plus(timeIntervals: RepeatedTimeInterval)
= addTimeIntervals(timeIntervals.timeInterval, timeIntervals.number)




fun task1(today: MyDate): MyDate {
return today + YEAR + WEEK
}

fun task2(today: MyDate): MyDate {
return today + YEAR * 2 + WEEK * 3 + DAY * 5
}

这也是教程的一部分:

import java.util.Calendar  

fun MyDate.addTimeIntervals(timeInterval: TimeInterval, number: Int): MyDate {
val c = Calendar.getInstance()
c.set(year, month, dayOfMonth)
when (timeInterval) {
TimeInterval.DAY -> c.add(Calendar.DAY_OF_MONTH, number)
TimeInterval.WEEK -> c.add(Calendar.WEEK_OF_MONTH, number)
TimeInterval.YEAR -> c.add(Calendar.YEAR, number)
}
return MyDate(c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DATE))
}

最佳答案

YEAR * 2TimeInterval * Int。编译器发现它不是内置组合,因此它会在 TimeInterval 上查找标记为 operator 的方法 times,该方法接受 >Int(例如 TimeInterval.times(Int)TimeInterval.times(Any))。该方法可以是 TimeInterval 的成员或扩展;它绝对没有理由成为 RepeatedTimeInterval 的成员。

事实上,RepeatedTimeInterval 根本不参与解析 YEAR * 2,它只是恰好是返回类型。那么 today + YEAR * 2MyDate + RepeatedTimeInterval 并应用相同的规则来选择 operator fun MyDate.plus(timeIntervals: RepeatedTimeInterval) (而不是用于today + YEARoperator fun MyDate.plus(timeInterval: TimeInterval)

请注意,使用此代码是不合法的,例如年 * 2 * 2; 需要RepeatedTimeInterval.times(Int),它也可以是成员或扩展。

关于kotlin - Kotlin 中的运算符重载以及此代码如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50858489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com