如何解决“变量点属性”构造var.property只是访问器的语法糖吗? 文件 src/PositiveInteger.gd文件 main.gd输出为:
这是这个问题的后续问题:Are accessors of class properties useful?
在此 complete answer 中声明:
"当你使用属性时,你是在使用 getter 和 setter 方法。属性是语言绑定的便利。因此,我们也可以说你不需要属性,只需要 getter 和二传手。"
但以下实验似乎与这一点相矛盾:
文件 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,这个行为是不是只和语言的核心类不同?
解决方法
我之前的回答适用于用 C++ 编写的核心类(并且应该适用于模块类)。默认情况下,它们不公开任何内容。相反,他们必须将其 C++ 方法绑定为方法和属性以公开它们。
现在,如果您想要在 GDScript 中创建的类的类似内容,您可以使用 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。