"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
这是这个问题的后续问题:
在此
"当你使用属性时,你使用的是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