微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“变量点属性”构造var.property只是访问器的语法糖吗? 文件 src/PositiveInteger.gd文件 main.gd输出为:

如何解决“变量点属性”构造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 举报,一经查实,本站将立刻删除。