找回密码
 立即注册
相关推荐换一批
  1. 织梦cms精仿XDGAME简约风格网站源码
  2. 月老盲盒交友H5程序开源版源码
  3. 自适应网站建设中HTML源码
  4. 彩虹多功能知识付费虚拟商城系统源码
  5. 全新thinkphp开发UI的AI网址导航系统源码
  6. 两套chatGPT AI官网HTML模板源码
  7. 中G蟑螂药行业市场前景如何?中G蟑螂药行业市场前景分析报告
  8. GB/T 7401-1987 彩色电视图像质量主观评价方法
  9. YD/T 2347-2011 家用以及类似环境下各类电子产品电磁照射评估和测量方法
  10. 2025年统编版一年级语文下册期末综合测评卷免费获取(含答案解析)
  11. 2018年小学一年级语文上册期中考试试卷及参考答案
  12. 小学一年级数学下册:智力拓展与思维挑战竞赛试题
  13. 小学数学第三册期中综合能力测试卷
  14. 语文背书填空题精选集锦
  15. 人教版小学二年级语文上册课堂同步练习(含图文解析)
  16. 二年级语文下册查字典专项复习练习题集
  17. 冀教版语文二年级上册:第七单元综合素养检测卷
  18. 冀教版小学语文二年级上册:第七单元综合素养检测卷
  19. 苏教版小学语文二年级下册:第五单元学习效果检测卷
  20. 北师大版小学二年级语文下册:第四单元基础巩固练习卷
  21. 小学语文二年级下册:第二单元综合能力检测卷
  22. 冀教版语文二年级上册:第一单元综合测试卷(二)
  23. 二年级数学上册:第七单元学习效果检测题
  24. 人教版二年级数学下册第二单元综合测评卷(含参考答案)
HTML我们init可以 | 软件设计/软件工程 2022-05-03 437 0star收藏 版权: . 保留作者信息 . 禁止商业使用 . 禁止修改作品
问题
我正在尝试理解以下代码
  1. class HTML {
  2.     fun body() { ... }
  3. }

  4. fun html(init: HTML.() -> Unit): HTML {
  5.     val html = HTML()  // create the receiver object
  6.     html.init()        // pass the receiver object to the lambda
  7.     return html
  8. }

  9. html {       // lambda with receiver begins here
  10.     body()   // calling a method on the receiver object
  11. }
复制代码

我真正无法理解的是

html.init() // 将接收者对象传递给 lambda

这里发生了什么?

有人可以简要解释一下这里发生了什么吗?

回答
首先,让这个例子保持简单,看看问题出在哪里。

我们可以像这样构建 html 函数:
  1. fun html(init: (HTML) -> Unit): HTML {
  2.     val html = HTML()
  3.     init(html)
  4.     return html
  5. }
复制代码

这将更容易理解(起初),因为我们只是将通常的单参数 lambda 传递给 html 函数。

但是现在调用站点不像构建器:
  1. html { it: HTML -> // just for clarity     
  2.     it.body() // not very nice
  3. }
复制代码

如果我们可以在没有 body() 的情况下在 html 中调用它,那不是很好吗?这是可能的!我们只需要一个带有接收器的 lambda。
  1. fun html(init: HTML.() -> Unit): HTML { // <-- only this changed
  2.     val html = HTML()
  3.     init(html)
  4.     return html
  5. }
复制代码

请参阅如何像以前一样将 html 作为参数传递给 init?

当然,我们也可以这样调用它:html.init(),如示例所示。 HTML 的实例在 lambda 块内变成了 this。

现在,我们可以这样做:
  1. html {      
  2.    this.body()
  3. }
复制代码

由于可以省略,因此我们在这里:
  1. html {      
  2.    body()
  3. }
复制代码

所以最终 lambdas 和接收器使代码更简洁,并允许我们使用良好的生成器语法。





上一篇:是否以编程方式访问 Android Q (SDK=29) 上的下载文件夹?
下一篇:MongoDB未找到数据:返回未定义