代码中的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节哈012024-10-09 -
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其实就是函数的第一个参数,只不过很多语言都隐式传递了。042024-10-10 -
bennyhuo
2024-10-09
block: BlockNode.() -> Unit
注意看 block的类型,他是 BlockNode的扩展函数00 -
bennyhuo
2024-10-09
是kotlin特有的扩展函数,确实不能按Java的思维理解。012024-10-09
相似问题