请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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()真的不懂

正在回答 回答被采纳积分+3

4回答

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

代码中的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 回复 有任何疑惑可以回复我~
  • 提问者 zippen #1
    html.block() 和 block(html)的效果一致,这个怎么说?也是kotlin的语法吗?但是block: BlockNode.() -> Unit里面BlockNode.()是无参的啊?怎么可以把html传进里面?那不是语法错误了吗?第二个问题是那block(html)的意义是?html传进里面有啥用?不是html{}说里面写子节点吗?不是应该把block传递给html么?怎么是html传给block了?
    回复 有任何疑惑可以回复我~ 2024-10-09 10:54:41
  • BlockNode是 receiver,相当于第一个参数。
    回复 有任何疑惑可以回复我~ 2024-10-09 11:19:48
  • 提问者 zippen 回复 bennyhuo #3
    回复 bennyhuo:ok,通过你的回答,再加上问了ai很多问题,终于弄懂了,简单一句话就是receiver的扩展函数,还需要结合kotlin中apply函数理解,感觉现在ai的回答比人类的回答让人更加理解,哈哈
    回复 有任何疑惑可以回复我~ 2024-10-09 17:29:10
bennyhuo 2024-10-09 10:36:14
block: BlockNode.() -> Unit

注意看 block的类型,他是 BlockNode的扩展函数
0 回复 有任何疑惑可以回复我~
bennyhuo 2024-10-09 10:31:54
是kotlin特有的扩展函数,确实不能按Java的思维理解。
0 回复 有任何疑惑可以回复我~
  • 提问者 zippen #1
    老师,我又编辑了一下问题,您再看看,我真的理解不了html.block(),能详细说说吗
    回复 有任何疑惑可以回复我~ 2024-10-09 10:36:38
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信