Я просто изучаю Kotlin Коанов, поэтому мой вопрос может быть очень глупым.
Решение главы по перегрузке операторов У меня есть два файла, оба на уровне root:
Первый из них помечен ошибками - я поставил их как комментарии
import TimeInterval // is gray
import addTimeIntervals // is gray
data class MyDate(val year: Int, val month: Int, val dayOfMonth: Int)
operator fun MyDate.plus(timeInterval: TimeInterval): MyDate
= MyDate.addTimeIntervals(Period(timeInterval, 1)) // Unresolved reference: addTimeIntervals
operator fun MyDate.plus(period: Period): MyDate
= MyDate.addTimeIntervals(period) //Unresolved reference: addTimeIntervals
fun task1(today: MyDate): MyDate {
return today + YEAR + WEEK // Unresolved reference: YEAR //Unresolved reference: WEEK
}
Второй - без ошибок:
import java.util.Calendar
/*
* Returns the date after the given time interval.
* The interval is specified as the given amount of days, weeks of years.
* Usages:
* 'date.addTimeIntervals(TimeInterval.DAY, 4)'
* 'date.addTimeIntervals(TimeInterval.WEEK, 3)'
*/
fun MyDate.addTimeIntervals(period: Period): MyDate {
val c = Calendar.getInstance()
c.set(year + if (period.timeInterval == TimeInterval.YEAR) period.amount else 0, month, dayOfMonth)
var timeInMillis = c.timeInMillis
val millisecondsInADay = 24 * 60 * 60 * 1000L
timeInMillis += period.amount * when (period.timeInterval) {
TimeInterval.DAY -> millisecondsInADay
TimeInterval.WEEK -> 7 * millisecondsInADay
TimeInterval.YEAR -> 0L
}
val result = Calendar.getInstance()
result.timeInMillis = timeInMillis
return MyDate(result.get(Calendar.YEAR), result.get(Calendar.MONTH), result.get(Calendar.DATE))
}
// Supported intervals that might be added to dates:
enum class TimeInterval { DAY, WEEK, YEAR}
operator fun TimeInterval.times(amount: Int): Period = Period(this, amount)
operator fun Int.times(timeInterval: TimeInterval): Period = timeInterval * this
data class Period(val timeInterval: TimeInterval, val amount: Int)
Я не понимаю, почему первый файл не может используйте константы и функцию расширения из второго. Перемещение класса enum в первый файл ничего не меняет. Использование констант с именем класса действительно помогает, но вся тема заключается в том, чтобы сделать код кратким, поэтому, очевидно, это неправильное решение для этого случая.
Почему они невидимы?