Kotlin中,理解T.()

Kotlin中,理解T.()

Kotlin比Java更方便的地方,其中之一是可以将函数作为参数。

上面三者都是将函数作为其它函数的参数来使用,其形式虽然简单,但理解并不简单。

一、共同点

三者的返回值相同,均为Unit,即没有返回值。

当然有返回值也可以,比如返回一个泛型R,或者是一个具体的值Int等

如:

T.()->R、 ()->R、(T) -> R

或者:

T.()->Int、 ()->Int、(T) -> Int

但是这不是重点,要理解三者,主要是分析前面的部分,这里返回Unit只是为了方便理解。

二、定义形式

可以结合Kotlin自带的作用域函数来理解:

apply:

fun T.apply(block: T.() -> Unit): T { block(); return this }

also:

fun T.also(block: (T) -> Unit): T { block(this); return this }

自定义一个使用()->Unit的例子:

inline fun T.doWithTry(block: () -> Unit) {

try {

block()

} catch (e: Throwable) {

e.printStackTrace()

}

}

三、使用

//定义了一个Person类

class Person(val name:String){

var age:Int = 0

var sex:Int = 0

}

fun test() {

val person= Person("张三")

person.also {

//没有指定参数名字,必须用it代指参数

it.age = 20 //it不能省略

it.sex = 0 //it不能省略

}

//或者

person.also {personValue->

//使用指定的参数名,同样personValue不能省略

personValue.age = 20

personValue.sex = 0

}

person.apply {

//直接访问Person的属性

this.age = 20 //this可以省略

this.sex = 1 //this可以省略

}

person.doWithTry{

//只能通过外部变量来访问Person

person.age = 20

person.sex = 1

}

}

上面的例子说明了以下几点:

1、T.()->Unit 的函数体中可以直接使用T代表的对象,即用this代表对象

2、(T) -> Unit 将T表示的对象作为实参通过函数参数传递进来,供函数体使用

3、 ()->Unit与T表示的对象没有直接联系,只能通过外部T实例的变量来访问对象

四、理解

T.()->Unit 中用this代表对象,而this的使用一般是一个类的成员函数中用来表示该类的实例对象本身,比如,为Person类加一个函数:

class Person(val name:String){

var age:Int = 0

var sex:Int = 0

fun info(){

//此函数中用this表示了当前的Person对象,this可以省略

println("age is ${this.age},sex is ${if(sex == 0) "女" else "男"}")

}

}

所以我们可以这样理解,T.()->Unit相当于是给类T定义了一个扩展函数,该函数没有形参,没有返回值,当然我们也可以增加参数与返回值,道理是一样的。

正是因为T.()为T的扩展函数,所以可以在函数体里直接访问T对象的属性或者成员函数。

(T) -> Unit与 ()->Unit只是一个普通的函数,一个带有参数,类型为T,另一个没有参数而已。

(T) -> Unit在使用it表示实参,是Lambda表达式所规定

//Lambda表达式形式

person.also {

//没有指定参数名字,必须用it代指参数

it.age = 20 //it不能省略

it.sex = 0 //it不能省略

}

//不使用Lambda表达式的原始形式

person.also(

//定义了一个匿名函数,符合also的参数要求

//it为参数名,可以更改成其它任何符合要求的名称

fun(it:Person){

//由also函数的定义可知,person对象会通过形参it传给匿名函数

it.age = 20

it.sex = 0

}

)

五、总结

1、()->Unit与(T) -> Unit是相同的,只是一个带参,一个不带参

(T) -> Unit通过形参T可将对象作为实参传给函数,所以函数体里能通过it或者指定名称的方式来访问该对象

2、T.()->Unit 等同于为T定义了一个无参数的扩展函数,所以在函数体内可以直接通过this或省略来访问T代表的对象

相关推荐

牛排也能合成!合成牛排与原切牛排怎么区分?
www.28365-365.com

牛排也能合成!合成牛排与原切牛排怎么区分?

📅 09-20 👁️ 8142
科普文章
www.28365-365.com

科普文章

📅 10-04 👁️ 3165
新飞度到底值不值得买?看这篇测试就够了
bt365体育在线官网

新飞度到底值不值得买?看这篇测试就够了

📅 07-14 👁️ 7848
企业形象
www.28365-365.com

企业形象

📅 09-04 👁️ 6877
H组概述:实力均衡的死亡之组
www.28365-365.com

H组概述:实力均衡的死亡之组

📅 10-12 👁️ 9272
王者荣耀S7上分英雄大全 S7赛季最强英雄排行榜
365体育投注3

王者荣耀S7上分英雄大全 S7赛季最强英雄排行榜

📅 09-06 👁️ 2032
【冠军的选择】尤尼克斯VT7LD测评!
365体育投注3

【冠军的选择】尤尼克斯VT7LD测评!

📅 10-11 👁️ 8384
汽车点火开关四个位置详解:功能揭示
365体育投注3

汽车点火开关四个位置详解:功能揭示

📅 08-15 👁️ 9091
2021哪个打车平台最便宜?最新安全靠谱打车平台推荐