与Kotlin之间的差异和运行

withrun具有相同的功能,只有不同的语法,还是有什么与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 } 

他们只有句法上的区别, run是扩展功能,而不是。 这里是定义(在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"