在看kotlin exposed源码时,看到如下语句:
fun <T> transaction(db: Database? = null, statement: Transaction.() -> T): T =
transaction(db.transactionManager.defaultIsolationLevel, db.transactionManager.defaultRepetitionAttempts, db, statement)
发现函数参数db是可空的,在调用db.transactionManager时,竟然没有使用空安全操作符?.或者!!.来调用,经过一番研究,发现是因为transactionManager是Database的一个扩展属性,在此定义:
val Database?.transactionManager: TransactionManager
get() = TransactionManager.managerFor(this) ?: throw RuntimeException("database $this don't have any transaction manager")
这样定义之后,就可以不使用?.或者!!.来访问该属性了,自己测了一下,确实如此:
class Test01 (var name: String){
// val name = "tom"
fun action(){
println("do something in Test01, name is $name")
}
}
val Test01?.age: Int
get() = 30
fun Test01.actionOutside(){
println("do something outside, name is $name")
}
fun main(){
var test01 = Test01("tom")
test01.action()
test01.actionOutside()
hello()
}
fun hello(obj1: Test01? = null){
println(obj1.age)
}
总结:
所谓的扩展 属性,扩展函数,看上去好像是在已经定义的类上增加了一个函数或者属性,实际上就是在外部定义了一个函数和属性。新定义函数之所以可以访问类中成员变量,是因为该扩展函数转成java函数之后,将该类的对象作为该函数的一个参数了。