Разница между с и запустить в Kotlin

Делатьwith а такжеrun имеют одинаковую функциональность только с разным синтаксисом, или есть существенные различия междуwith а такжеrun?

Какой правильный путь?

adapter.run {
    notifyDataSetChanged()
    if (activityDetails.isEmpty())
        emptyText.visibility = View.VISIBLE
    else 
       emptyText.visibility = View.GONE
}


with(adapter){
   notifyDataSetChanged()
   if (activityDetails.isEmpty())
       emptyText.visibility = View.VISIBLE
   else 
       emptyText.visibility = View.GONE
}

Ответы на вопрос(2)

Решение Вопроса

Они имеют только синтаксическую разницу,run являетсяфункция расширения в то время какwith не является. Вот определения (вkotlin-sdlib:1.0.3):

public inline fun <T, R> T.run(block: T.() -> R): R = block() // equivalent to this.block()

public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

посколькуrun является функцией расширения, у нее есть еще один неявный аргумент типаTТаким образом, типы аргументов одинаковы. Тела функций также практически одинаковы.

Их производительность также должна быть эквивалентной, так как обаinline функции: полученный байт-код должен содержать только встроенныйblock тело.

Различия в использовании функций обусловлены тем, чтоrun это расширение.

Первый,run подходит для цепочки звонков:

foo.run { bar }.run { baz }

Во-вторых, и это более важно, если объявленный тип переменной имеетrun Функция с той же сигнатурой будет вызываться вместо расширения. А такжеrun может быть затенено другим расширением. Этокак разрешаются расширения, Пример:

class MyClass {
     fun <R> run(blockIgnored: MyClass.() -> R): Nothing = throw RuntimeException()
}

"abcdefg".run { println("x") } // prints "x"
MyClass().run { println("x") } // throws RuntimeException
(MyClass() as Any).run { println("x") } // prints "x"
 Sai Kiran21 июл. 2016 г., 13:01
Так что я могу и пользователь. Доза как влияет на производительность приложения?
 hotkey21 июл. 2016 г., 13:02
@SaiKiran, да, они полностью взаимозаменяемы, и их производительность должна быть одинаковой, так как они обаinline функции.

но для переменной с нулевым значением лучше использоватьT.run()

Например. еслиwebview.settings обнуляется, ниже покажет отчетливый

with(webview.settings) {
    this?.javaScriptEnabled = true
    this?.databaseEnabled = true
}

// similarly
webview.settings?.run {
    javaScriptEnabled = true
    databaseEnabled = true
}

Ваш ответ на вопрос