跳到主要内容

Variant

简要描述

IdeaXR中最重要的数据类型。

描述

在计算机编程中,Variant类是旨在存储各种其他类型的类。 动态编程语言(如PHP,Lua,JavaScript和IVRScript)喜欢使用它们在后端存储变量的数据。 使用这些变体,属性可以自由更改值类型。

var foo = 2 # foo is dynamically an integer
foo = "Now foo is a string!"
foo = Reference.new() # foo is an Object
var bar: int = 2 # bar is a statically typed integer.
# bar = "Uh oh! I can't make static variables become a different type!"

IdeaXR跟踪变量中的所有脚本API变量。甚至没有意识到,您一直都在使用Variants。当一种特定的语言强制执行自己的规则以保持数据类型时,该语言将在基本的Variant脚本API上应用其自己的自定义逻辑。

-IVRScript自动将值包装在其中。默认情况下,它将所有数据保留在普通的Variants中,然后有选择地对变量类型强制执行自定义静态类型规则。

-VisualScript也跟踪Variants内部的属性,但它也使用静态类型。 GUI界面强制属性具有不随时间变化的特定类型。

-C#是静态类型的,但是当需要表示动态值时,可以使用Mono object类型代替IdeaXR的Variant类。 object是Mono运行时的等效概念。

-静态类型的语言NativeScript C ++没有定义内置的类似Variant的类。 IdeaXR的GDNative绑定为用户提供了自己的IdeaVR :: Variant类; C ++代码开始与IdeaXR运行时进行交互的任何地方都是您可能必须开始将数据包装在Variant对象内部的地方。

全局@函数返回存储在当前变量中的Variant类型的枚举值(请参见[Variant.Type])。

var foo = 2
match typeof(foo):
TYPE_NIL:
print("foo is null")
TYPE_INTEGER:
print("foo is an integer")
TYPE_OBJECT:
# Note that Objects are their own special category.
# To get the name of the underlying Object type, you need the `get_class()` method.
print("foo is a(n) %s" % foo.get_class()) # inject the class name into a formatted string.
# Note also that there is not yet any way to get a script's `class_name` string easily.
# To fetch that value, you need to dig deeply into a hidden ProjectSettings setting: an Array of Dictionaries called "_global_script_classes".
# Open your project.IdeaVR file to see it up close.

Variant仅占用20个字节,并且几乎可以在其中存储任何引擎数据类型。变体很少用于长时间保存信息。相反,它们主要用于通信,编辑,序列化和移动数据。

IdeaXR专门投资使其Variant类尽可能灵活。如此之多,以至于它可用于多种操作,以促进所有IdeaXR系统之间的通信。

变体:

-几乎可以存储任何数据类型。

-可以在许多变体之间执行操作。

-可以进行哈希处理,因此可以与其他变体快速比较。

-可用于在数据类型之间安全地转换。

-可用于抽象调用方法及其参数。

-可用于推迟调用或在线程之间移动数据。

-可以序列化为二进制并存储到磁盘,或通过网络传输。

-可以序列化为文本,并将其用于打印值和可编辑的设置。

-可以用作导出的属性,因此编辑器可以对其进行通用编辑。

-可用于字典,数组,解析器等。

容器(数组和字典):两者均使用变体实现。 字典可以将用作键的任何数据类型与任何其他数据类型进行匹配。 [Array]仅包含一个Variants数组。当然,变体还可以在内部容纳字典数组,从而使其更加灵活。

对容器的修改将修改对该容器的所有引用。如果需要多线程访问,应创建一个[Mutex]来锁定它。