Вы видели эти "это" на лету, приятель?Это единственное, в чем эти двое отличаются.Но из-за этого они имеют различное использование.Прежде всего, при запуске вызов '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, есть еще один вызываемый объект, для этого контекста это не имеет значениякак я говорил здесь о функциях расширения, но это то, что стоит прочитать.