Почему Android Studio использует let вместо запуска при создании фрагмента - PullRequest
0 голосов
/ 19 сентября 2018

Android Studio создает этот код, когда вы создаете Fragment, используя File -> New -> Fragment

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.let {
        param1 = it.getString(ARG_PARAM1)
        param2 = it.getString(ARG_PARAM2)
    }
}

Не лучше ли использовать run на arguments, так как вы можете опуститьit?Я знаю, что вы используете let для нулевой безопасности, но run также дает вам Bundle, а не Bundle?

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    arguments?.run {
        param1 = getString(ARG_PARAM1)
        param2 = getString(ARG_PARAM2)
    }
}

Есть ли особая причина, по которой он использует let вместо run

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вы видели эти "это" на лету, приятель?Это единственное, в чем эти двое отличаются.Но из-за этого они имеют различное использование.Прежде всего, при запуске вызов 'this' будет указывать на объект, который вызвал run.таким образом, прежде всего, будут вызываться все свойства или методы, которые имеет объект.Как пример:

...
mObject?.run {
    hello();
}
...

Это вызовет метод hello объекта.Но, допустим, это тот же сценарий, но вы хотите вызвать функцию с тем же именем, что и метод объекта.Как пример:

...
fun hello() = print("not the hello from that object")
...
mObject?.run {
    hello();
}
...

Это все равно будет работать, но вы все равно будете запускать привет из объекта.Что и как, когда вы используете let, вы можете выбрать, использовать ли метод, который имеет объект или функцию. Запуск PS может выполняться самостоятельно, в то время как пусть необходимо получить доступ из переменной и т. Д.

Бонус

Есть еще два к этомувариант, который применяется, а также.Теперь, чем эти два отличаются от запуска и запуска?let and run может вернуть себя или что-либо еще, или совсем не возвращать.Пока применяются, а также всегда будет возвращать используемый объект.И аналог let - тоже, и apply - запуск.

Второй бонус

Допустим, вы хотите проверить, является ли объект нулевым, перед его использованием, а затем установить его свойства, которых нет вКонструктор.

var mObject: MObject = mObjectUndecided?.also {
    // Do Something
}

Но что, если mObjectUndecided имеет значение null?

val mObjectUndecided: MObject? = null
var mObject: MObject = mObjectUndecided?.apply{
    // Do Something
} ?: run {
    MObject().also {
        // Do Something
    }
}

Но что если вам нужно вызвать функцию / переменную, которая совпадает с mathod / свойствомобъект?

val mObjectUndecided: MObject? = null
var mObject: MObject = mObjectUndecided?.let{
    // Do Something
    it // return it if its not null
} ?: run {
    MObject().also {
        // Do Something
    }
}

Но что, если MObject сконструирован так:

class MObject {
    var name: String? = null
    var mObjectNext: MObject? = null
}

Тогда вам придется его вкладывать (запускать, запускать, применять, также).Но где-то внутри гнезда вы хотите вызвать объект из более высокой иерархии?

var mObject: MObject = mObjectUndecided?.let{ mObject1 ->
    // Do Something
    mObject1.mObjectNext?.let { mObject2 ->
        // Do Something
        mObject2.mObjectNext?.let { mObject3 ->
            // Do Something
        }
        // Do Something
    }
    // Do Something
    it // return it if its not null
} ?: run {
    MObject().also {
        // Do Something
    }
}

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

0 голосов
/ 19 сентября 2018

FWIW, ни один из них на самом деле не имеет смысла, поскольку они оба возвращают значение.

Поскольку вы не хотите возвращать значение в этом случае:

  • Если выхотите использовать it, используйте also вместо let.
  • Если вы хотите использовать приемник, используйте apply вместо run.

И ... нет, я не знаю, почему Android Studio будет использовать let вместо run.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...