如果已知Variant.Type,如何转换数据类型?

How to convert data type if Variant.Type is known?

如果我从typeof()知道Variant.Type,如何转换数据类型?

例如:

var a=5;
var b=6.9;
type_cast(b,typeof(a)); # this makes b an int type value

How do I convert the data type if I know the Variant.Type from typeof()?

你不能。 GDScript 没有 generics/type 模板,因此除了简单的类型推断之外,无法在不知道类型的情况下指定类型。

因此,任何将值转换为仅在运行时已知的类型的解决方法都必须声明为 return 变体,因为无法指定类型。

再者,将结果存储在变量上,如果不知道类型,如何声明变量?


让我们看一下变量声明。如果不指定类型,则会得到 Variant。

例如,在此代码中,a 是一个恰好具有 int 值的变体:

var a = 5

在另一个例子中 a 是一个 int:

var a:int = 5

这也是一个int:

var a := 5

在这种情况下,变量的类型是根据您用来初始化的,即类型是推断的。

你可能认为你可以像这样使用它:

var a = 5
var b := a

嗯,不。那是一个错误。 “无法推断变量类型”。就 Godot 而言 a 在这个例子中没有类型。


I'm storing data in a json file: { variable:[ typeof(variable), variable_value ] } I added typeof() because for example I store an int but when I reassign it from the file it gets converted to float (one of many other examples)

确实JSON不擅长存储Godot类型。这就是为什么许多作者不建议使用 JSON 来保存状态。

现在,请注意我们无法获得具有正确类型的变量,如上所述。相反,我们应该尝试获得正确类型的 Variant。

如果您不能更改序列化格式,那么您将需要一个大的 match 语句。像这样:

match type:
    TYPE_NIL:
        return null
    TYPE_BOOL:
        return bool(value)
    TYPE_INT:
        return int(value)
    TYPE_REAL:
        return float(value)
    TYPE_STRING:
        return str(value)

这些不是 Variant 可以容纳的所有类型,但我认为它可以用于 JSON。


现在,如果您可以更改序列化格式,那么我会建议使用 str2varvar2str

例如:

var2str(Vector2(1, 10))

将return一个String"Vector2( 1, 10 )"。如果你这样做:

str2var("Vector2( 1, 10 )")

您得到一个 Vector2 的变体,x1y10

通过这种方式,您可以始终以 Godot 可以解析的人类可读格式存储 Strings。 如果你想对整个对象这样做,或者你想把它们放在一个 JSON 结构中,那由你决定。

顺便说一句,您可能还对ResourceFormatSaver and ResourceFormatLoader感兴趣。