
By: George Marques Aug 04, 2020
有些人可能知道,我最近一直在做的重构,现在已经合并到主干分支了。这个工作在之前的进度报告中已经解释过了。
主要变化
虽然我已经打开了一个pull request来更新文档,但我还是要在这里简单描述一下有哪些变化。
附加说明
我们现在有了注解支持,而且是用来替换沿途引入的一些关键词。这包括RPC关键字,如@master、@puppet和@remote。
以前的导出关键字现在被每个案例的专门注释列表所取代。例如,如果你想要一个范围,你可以使用@export_range注解。不再需要将类型设置为参数,因为它可以从变量的类型指定符中获取(例如:@export var my_number: int)。
这有一个额外的好处,因为这些注解具有代码完成和参数提示的功能,这使得它们更容易使用,而不必像以前那样记住所有可能的组合。
这也包括一个@icon注解,必须使用这个注解,而不是像之前那样添加在class_name后面。
属性
之前的setget语法被删除,取而代之的是属性。它的目的是为了与变量声明更紧密地联系在一起,避免你不得不创建专门的函数(如果你喜欢的话,还是可以的)。另一个变化是,与setget不同的是,即使在同一个类中,属性总是调用它们的setter/getter。这给用户提供了一个一致的行为,在重构过程中不会引起混淆或导致潜在的错误。
await 代替 yield
你可能已经知道,yield关键字被删除了,取而代之的是 await。它不仅有一个更有意义的名字,而且还利用了Godot主分支中引入的一流信号。它的语法更容易理解,并且有更少的模板(当等待coroutine时,你不需要写 "完成 "信号。
如果你调用的函数并不总是作为一个coroutine工作(你不需要处理特殊情况),它也更透明,而且它是类型安全的,因为你不能在你期待返回值的时候收到一个函数状态。
super关键词
现在你必须使用super关键字来调用在超级类中定义的函数,而不是覆盖版本,而不是在函数名前加上点(.)。这也适用于构造函数,使其在总体上更加一致,提高了灵活性。
单独调用super()会调用你所在的同一个函数,但使用超级类实现。如果你需要调用不同的函数,可以使用super.function_name()。
代码完成
如前次报告所述,代码完成是一项正在进行的工作。现在基本上已经完成。我知道,它可能需要一些生活质量的改进,但这将在以后进行。目前,它应该和以前一样。如果有什么缺失,请随时报告问题。
删除多级调用
另一个常见的混乱来源被删除了。如果你创建了一些生命周期函数的重写(如_process或_ready),它仍然会隐式地调用超类的实现。更糟糕的是:有些函数在子类之前调用了超类,有些函数则反其道而行之。
这个行为现在已经完全被删除了。如果你需要调用父级实现,你可以使用上面提到的super关键字。这在OOP语言中很常见,所以它应该更符合用户的期望(这在过去报告这个行为的多个问题中得到了证明)。它还让用户可以控制何时应该调用超级实现。
请注意,C++代码中定义的方法仍然会被调用。这是为确保引擎行为的正确性所需要的(比如按钮_gui_input需要执行按压行为)。
测试
我花了很大一部分时间来测试GDScript的实现,并在途中修复了大量的bug和崩溃。如果你发现崩溃或问题,不要害怕报告它(如果之前没有报告的话)。最终我会进行一轮大的bug修复来稳定它的发布,但现在我会尽量让GDScript保持在一个可行的状态,尤其是不崩溃。
未来
目前,我正在为代码生成接口进行抽象。这将有助于创造一种能力,在不改变编译器的情况下改变目标后端语言(目前只是GDScript VM本身),最终为代码优化铺平道路。更多关于这方面的细节将在下一份进度报告中介绍。
在那之后,我将开始在虚拟机中添加类型化的指令,当你在脚本中使用静态类型时,速度应该会大幅提高。
GDScript进行重大重构,引入注解支持、属性系统、await替代yield等新特性,提升代码完成体验,删除多级调用,增加super关键字,代码更易读、可控。
1099

被折叠的 条评论
为什么被折叠?



