关于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 串口通信-MSComm控件使用详解

    串口通信-MSComm控件使用详解MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。 MicrosoftCommunicationsControl(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通…

    2025年6月26日
    3
  • (转)SAP 将smartforms的报表转成PDF

    (转)SAP 将smartforms的报表转成PDF(转)SAP 将smartforms的报表转成PDF

    2022年4月20日
    48
  • 什么是MVC三层架构?「建议收藏」

    什么是MVC三层架构?「建议收藏」1.1、什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。 是将业务逻辑、数据、显示分离的方法来组织代码。 MVC主要作用是降低了视图与业务逻辑间的双向偶合。 MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。 Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:ValueObj

    2022年6月25日
    26
  • expdp时遇到ORA-31693&amp;ORA-02354&amp;ORA-01466

    expdp时遇到ORA-31693&amp;ORA-02354&amp;ORA-01466

    2022年1月21日
    99
  • 国内数据集网站_数据网站

    国内数据集网站_数据网站如果你是一个初学者,你每完成一个新项目后自身能力都会有极大的提高,如果你是一个有经验的数据科学专家,你已经知道这里所蕴含的价值。 本文将为您提供一个网站/资源列表,从中你可以使用数据来完成你自己的数据项目,甚至创造你自己的产品。一.如何使用这些资源?如何使用这些数据源是没有限制的,应用和使用只受到您的创造力和实际应用。使用它们最简单的方法是进行数据项目并在网站上发布它们。这不仅能提高你的数…

    2022年10月16日
    4
  • 怎么让FOXMAIL关了以后在右下角自动收取邮件

    怎么让FOXMAIL关了以后在右下角自动收取邮件

    2021年10月19日
    41

发表回复

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

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