Котлин - локальные переменные против глобальных переменных

A (менее элегантный) подход с базовыми функциями:

transform(shop.data, 
          profit = ifelse(is.na(profit), 
                          ave(profit, hour, FUN = function(x) mean(x, na.rm = TRUE)), 
                          profit))

#   day hour profit
# 1   1    8    100
# 2   1   16    200
# 3   2    8     50
# 4   2   16     60
# 5   3    8     75
# 6   3   16    130
0
задан Bawa 16 February 2019 в 15:21
поделиться

2 ответа

Область действия локальной переменной - это функция, в которой она определена. У компилятора нет проблем с проверкой того, что локальная переменная была инициализирована внутри функции, прежде чем она будет доступна в первый раз.

Что касается открытого класса, область видимости бесконечна, поэтому компилятор не может гарантировать, что поле будет инициализировано до того, как оно будет доступно. Чтобы не дать программе перейти в плохое состояние с помощью неинициализированной переменной, компилятор вызывает ошибку.

0
ответ дан Egor 16 February 2019 в 15:21
поделиться
class A{

    var abc : String  // throws compile time error

    fun myOwnedFun(){
       var abcd : String // throws compile time error while accessing it
       abcd. // throws error now, suggests you to initialize it.
    }

}

Это потому, что Kotlin построен как нулевой безопасный язык, что означает, что все переменные должны быть инициализированы перед его использованием, либо как nullable, к которому следует добавить суффикс ? и присвоить null, либо по умолчанию конструктор для любых других классов, или используйте lateinit var, если вы уверены, что будете назначать его где-то перед первым доступом к нему.

В Android Kotlin lateinit var широко используется для глобальных переменных, которые будут назначаться в методах жизненного цикла, таких как onCreate() и т. Д.,

0
ответ дан Karthik 16 February 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: