与Kotlin之间的差异和运行
with
和run
具有相同的功能,只有不同的语法,还是有什么与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"
- 伴侣对象和Kotlin中没有课程的乐趣之间哪种方式更好?
- 如何在Kotlin中设置一个值的首选项?
- Kotlin可变属性的扩展函数
- Kotlin使用运行时断言进行空检查 – 性能开销?
- java.util.HashMap是否没有在Kotlin中实现java.util.Map?
- 解释为什么显示警告未经检查铸造source.readArrayList(data !!。javaClass.classLoader)为ArrayList <Data>?
- 如何让黄瓜让Spring注入一步定义类?
- 如何在Android Activity上使用Kotlin扩展函数进行空检查
- 在Gradle usin Kotlin中构建JAXB类