Невидимость констант и функций расширения в Kotlin - PullRequest
0 голосов
/ 13 апреля 2020

Я просто изучаю 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 в первый файл ничего не меняет. Использование констант с именем класса действительно помогает, но вся тема заключается в том, чтобы сделать код кратким, поэтому, очевидно, это неправильное решение для этого случая.

Почему они невидимы?

1 Ответ

0 голосов
/ 13 апреля 2020

Я нашел это!

Видимость константы достигается

import EnumName.*

Видимость функций расширения блокируется чрезмерным использованием имени класса в качестве префикса внутри других определений функций расширения.

...