代码中的html.block()我不是很理解

来源:6-7 案例:HTML DSL

zippen

2024-10-09

interface Node {
    fun render(): String
}

class BlockNode(val name: String): Node {

    val children = ArrayList<Node>()
    val properties = HashMap<String, Any>()

    override fun render(): String {
        //ToDo
    }
 }
 fun html(block: BlockNode.() -> Unit): BlockNode {
    val html = BlockNode("html")
    html.block()
    return html
}

代码中的html.block()我不是很理解,class BlockNode也没有block方法啊,
按照java的思维,不是BlockNode这个类中有block这个方法才可以调用吗?但是并没有这个方法;
而且传入参数block返回的是unit,已知class BlockNode传入字符串“html”实例化然后val html接收;
然后就糊涂了,html怎么就可以.block,html.block()的返回值是啥?
视频上说把html传给block究竟是什么意思?
没学过这个语法,但因为看过之前那个block: T.() ->unit,我可以理解block()返回的是this,就是说如果T实例化了,那么实例化对象t { }里面,可以使用this。
但是不理解视频上说 html.block()把html传递给block这句话的意思?按我的理解就是BlockNode的实例化对象是html,那么html{ }里面已经可以使用this了呀,t.block()究竟是啥意思呢?就是html.block()真的不懂

写回答

4回答

bennyhuo

2024-10-09

建议看一下3-5和4-2节哈
0
1
zippen
emmm。。刚刚看了,没有任何帮助,我刚刚只是写错了,我知道block: T.() ->unit返回的是unit,就是不返回任何东西,刚刚我想表达的就是这么写,block{}里面可以用this。我感觉主要是6-3开始我就有点不懂了,我也百度了相关的资料,网上也只是说block{}里面可以用this,如果是block: (T) ->T,那么block{}里面可以用it,我也不太清楚原理,只是死记硬背罢了
2024-10-09
共1条回复

bennyhuo

2024-10-09


代码中的html.block()我不是很理解,class BlockNode也没有block方法啊,

注意block的类型,他是一个函数,类型里面有receiver,这些概念在前面讲函数和扩展函数的时候有提到。


按照java的思维,不是BlockNode这个类中有block这个方法才可以调用吗?但是并没有这个方法;

不能按照Java的思维,Java没这个特性。



而且传入参数block返回的是unit,已知class BlockNode传入字符串“html”实例化然后val html接收;
然后就糊涂了,html怎么就可以.block,html.block()的返回值是啥?

看下block的类型,有返回值类型哈。



视频上说把html传给block究竟是什么意思?
没学过这个语法,但因为看过之前那个block: T.() ->unit,我可以理解block()返回的是this,


返回的是 Unit,同学可以复习一下函数类型


就是说如果T实例化了,那么实例化对象t { }里面,可以使用this。
但是不理解视频上说 html.block()把html传递给block这句话的意思?按我的理解就是BlockNode的实例化对象是html,那么html{ }里面已经可以使用this了呀,t.block()究竟是啥意思呢?就是html.block()真的不懂

html.block() 和 block(html)的效果一致,this其实就是函数的第一个参数,只不过很多语言都隐式传递了。
0
4
bennyhuo
回复
zippen
666 ai更懂你
2024-10-10
共4条回复

bennyhuo

2024-10-09

block: BlockNode.() -> Unit

注意看 block的类型,他是 BlockNode的扩展函数
0
0

bennyhuo

2024-10-09

是kotlin特有的扩展函数,确实不能按Java的思维理解。
0
1
zippen
老师,我又编辑了一下问题,您再看看,我真的理解不了html.block(),能详细说说吗
2024-10-09
共1条回复

学会Kotlin 突破开发语言瓶颈

如果有一门语言可以取代Java,那么它一定是Kotlin。

1760 学习 · 481 问题

查看课程