关于Kotlin扩展函数与lambda的上下文

关于Kotlin扩展函数与lambda的上下文

大家好,又见面了,我是全栈君。

通常我们在写一个扩展函数,如果传入一个lambda表达式大概是下面这样

inline fun <T> T.apply(block: () -> Unit) {
    block()
}
复制代码

这个时候它的上下文是谁呢?

在扩展的方法内部,这个方法的上下文其实就是这个T,也就是调用这个方法的对象,所以this == T,这一点很明显。

那么在外部使用的时候,如下代码中呢?

val textView = TextView(activity).apply {
    //这里的上下文是谁呢?
}
复制代码

注意,这里虽然调用了apply方法,但是后面的代码块{}实际上是block: () -> Unit这个lambda的简写,也就是说我们是处于一个lambda表达式中,所以它的上下文自然就是这段代码外部的上下文。可能是activity,也可能是别的什么东西。我最初在这里卡了一会儿,就是不小心把这里也当做了扩展的内部,纠结于为毛这里不能拿到这个TextView对象。

但是我们知道Kotlin自己带的apply方法是可以在这个lambda中去拿到调用它的对象,然后去做一些配置操作的,也就是说是可以把这个lambda中的上下文变成调用者的。怎么做呢?

其实很简单,将apply中的那个lambda也变成调用者的一个扩展方法就行了。像下面这样写。

inline fun <T> T.apply(block: T.() -> Unit) {
    block()
}
复制代码

这里可以看到我给把这个lambda变成了T.()->Unit,表示它是T的一个扩展方法。既然这个lambda一家是T的一个扩展方法了,那么他内部的上下文自然就是这个T了。所以就可以有了如下的写法。

TextView(activity).apply {
    text = "HelloDSl"
    textSize = 16.sp2px()
}
复制代码

是不是已经和Kotlin自己的apply方法几乎一样了,但是既然apply是用来快速构造对象的,那么自然需要它能将调用它的对象返回回来,所以加上返回值就变成了下面这样。

inline fun <T> T.apply(block: T.() -> Unit): T {
    block()
    return this
}
复制代码
val textView = TextView(activity).apply {
    text = "HelloDSl"
    textSize = 16.sp2px()
}
复制代码

那么这个东西有什么用处呢? 有了它就可以轻松写出一个DSL啦~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107736.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 黑盒 测试用例设计方法「建议收藏」

    黑盒 测试用例设计方法「建议收藏」概述黑盒测试用例设计方法包括等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法等。等价类划分法概念等价类划分法是把程序的输入域划分成若干部分(子集),然后从每个部分中选取少数代表性数据作为测试用例。每一类的代表性数据在测试中的作用等价于这一类中的其他值。等价类划分法的应用1.等价类是指某个输入域的子集合。在该子集合中,各个输入数据对于揭露程序中的错…

    2022年6月11日
    34
  • echarts关系图谱初级实现

    echarts关系图谱初级实现echarts关系图谱初级实现具体实现的效果如图(主要是使用了echarts的力引导图),主要是为了展现人与人还有人与物之间的关系。如果你的项目只是用于展示的话,那么使用这个demo应该就能帮助到你。demo地址:…

    2022年6月26日
    56
  • sublime Text3配置及快捷键、插件推荐总结

    sublime Text3配置及快捷键、插件推荐总结

    2021年11月29日
    47
  • idea正则替换小技巧「建议收藏」

    idea正则替换小技巧「建议收藏」相信很多idea开发的人都遇到过要替换某些拷贝的内容然后转换成自己的注释,但是一个一个替换又太麻烦,正则替换这时就是快速解决的办法。如下面图所示这个java类里面的属性就是mybatis的自动生成,带了很多注释,但如果想换成swagger来展示给前端看的时候就需要替换成下面的样子。想要做到这一步只需要执行下面的正则就行。首先点击打开替换窗口,idea原生快捷键按CTRL+R就行,全…

    2022年9月27日
    0
  • Microsoft store应用商店无法加载页面代码: 0x80131500

    Microsoft store应用商店无法加载页面代码: 0x80131500Microsoftstore应用商店无法加载页面代码:0x80131500出错后我在微软官网查找问题原因,以下设置都可能解决问题:原文建议先尝试更换网络连接,比如连接个人手机热点,再使用MicrosoftStore进行尝试。如果您连接了VPN或下载了第三方防火墙应用,建议断开VPN,卸载第三方防火墙应用。①调整网络连接…

    2022年6月9日
    52
  • 安全帽识别系统-智慧工地的守护者

    安全帽识别系统-智慧工地的守护者安全帽识别系统能够实时对未佩戴安全帽的行为发出警告,及时提醒监理人员处理,为作业人员筑起一道人工智能的安全防火墙。鹰眸安全帽识别系统面世之后,在业界引起了不小的震动,相关企业不但积极推广,还提出了许多建设性的意见,毕竟将人工智能的深度学习应用于视频分析还是很新的事物,那么鹰眸安全帽识别系统能做什么,在此与大家一起分享,希望起到抛砖引玉的作用。一、鹰眸安全帽识别系统通过视频实时分析工作区域,如…

    2022年5月15日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号