"variable dot property" 构造 (var.property) 只是访问器的语法糖吗?

Is "variable dot property" construct (var.property) just syntaxic sugar for accessors?

这是这个问题的后续问题:

在此中声明:

"当你使用属性时,你使用的是getter和setter方法。属性是一种方便的语言绑定. 因此,我们也可以说您不需要 属性,只需要 getter 和 setter."


但下面的实验似乎与这一点相矛盾:

文件src/PositiveInteger.gd

使用 setter 可以防止将负整数分配给 属性 n

class_name PositiveInteger

var n: int 

func _init() -> void:
    self.n = 0
    
func set_n(_n: int) -> void:
    if _n < 0:
        n = 0
    else:
        n = _n

func get_n() -> int:
    return n

文件main.gd

现在让我们考虑这个测试,c1 使用 setter,c2 使用点结构:

tool

extends EditorScript
tool

extends EditorScript

func _run() -> void:
    var PositiveInteger = load("res://src/PositiveInteger.gd")
    var c1 = PositiveInteger.new()
    c1.set_n(-3)
    print("c1: " + str(c1.n))
    var c2 = PositiveInteger.new()
    c2.n = -3
    print("c2: " + str(c2.n))

输出为:

c1: 0
c2: -3

所以 属性 赋值似乎绕过了 setter,这种行为是否仅与语言的核心 class 不同?

我之前的回答适用于核心 classes(并且应该适用于模块 classes),它们是用 C++ 编写的。默认情况下,它们不公开任何内容。相反,他们必须将 C++ 方法绑定为方法和属性以公开它们。

现在,如果您想要在 GDScript 中创建的 class 类似的东西,您可以使用 setget:

class_name PositiveInteger

var n: int setget set_n, get_n

func _init() -> void:
    self.n = 0
    
func set_n(_n: int) -> void:
    if _n < 0:
        n = 0
    else:
        n = _n

func get_n() -> int:
    return n

这样你的输出应该是:

0
0