结构体
GLibVariantType
since: 2.24
描述 [src]
struct GVariantType {
/* No available fields */
}
在 GVariant
类型系统中的类型。
此部分介绍 GVariant
类型系统。它在很大程度上基于 D-Bus 类型系统,有两处重大变更和一些次要限制减少。因此,D-Bus 规范 在使用 GVariant
时提供了大量有用的信息。
相对于 D-Bus 类型系统,第一处重大变更即引入了 maybe(或“可空”)类型。在 GVariant
中的任何类型都可以转换为 maybe 类型,在这种情况下,nothing
(或 null
)将成为一个有效值。已通过在类型字符串中引入字符 m
添加 maybe 类型。
第二处重大变更即 GVariant
类型系统支持“不确定类型”的概念,即那些不如 D-Bus 中发现的普通类型具体。例如,可以在 GVariant
中指代“任何类型的数组”,而 D-Bus 类型系统需要您指代“整数数组”或“字符串数组”。已通过在类型字符串中引入字符 *
、?
和 r
添加不确定类型。
最后,取消了与类型复杂度有关的所有任意限制,以及词典项只能嵌套在数组内的限制。
就像在 D-Bus 中一样,GVariant
类型用字符串(“类型字符串”)描述。在遵守上述差异之下,这些字符串的形式与 D-Bus 中的形式相同。注意:D-Bus 在消息语境下始终处理,因此不会在它的接口中出现单独的类型字符串。相反,“签名”是消息中每个参数的类型字符串的连接。 GVariant
会直接处理单个值,所以 GVariant
类型字符串始终描述恰好一个值。这意味着 D-Bus 签名字符串通常不是有效的 GVariant
类型字符串——除非它是恰好包含一个参数的消息的签名。
不确定类型类似于在其他类型系统中可以称为抽象类型的类型。没有值可以恰好具有不确定类型,但是可以存在具有不确定类型的子类型的类型的值。也就是说,g_variant_get_type()
永远不会返回不确定类型,但是使用不确定类型调用 g_variant_is_of_type()
可能会返回 true。例如,您不能有表示“没有特定类型”的数组,但是您可以有“整数数组”,它当然匹配“没有特定类型”的数组类型,因为“整数数组”是“没有特定类型的数组”的子类型。
这类似于其他类型系统中如何直接不存在抽象类实例,但是可能存在其非抽象子类型的实例。例如,在 GTK 中,没有类型的对象 GtkWidget
可存在(因为 GtkWidget
是一个抽象类),但是 GtkWindow
当然可以实例化,您可以说 GtkWindow
是 GtkWidget
(因为 GtkWindow
是 GtkWidget
的子类)。
两个类型不能按值比较;使用 g_variant_type_equal()
或 g_variant_type_is_subtype_of()
可以使用 g_variant_type_copy()
复制,使用 g_variant_type_free()
释放。
GVariant 类型字符串
GVariant
类型字符串可以是以下任意一种
- 任何基本类型字符串(在下方列出)
v
、r
或*
- 字符
a
或m
之一,后跟另一个类型字符串 - 字符
(
,后跟零个或更多其他类型字符串的连接,后跟字符)
- 字符
{
,后跟基本类型字符串(参见下方),后跟另一个类型字符串,后跟字符}
基本类型字符串描述基本类型(根据 g_variant_type_is_basic()
),并且其长度始终为单个字符。有效的基本类型字符串有 b
、y
、n
、q
、i
、u
、x
、t
、h
、d
、s
、o
、g
和 ?
。
上面的定义对任意深度进行了递归。aaaaai
和 (ui(nq((y)))s)
都是有效的类型字符串,a(aa(ui)(qna{ya(yd)}))
也是如此。为了避免达到内存限制,GVariant
对 65 个嵌套容器的递归深度施加了限制。这是 D-Bus 规范 (64) 中的限制,外加一个以允许将 GDBusMessage
嵌套在顶级元组中。
每个字符的含义如下
b
:G_VARIANT_TYPE_BOOLEAN
的类型字符串;布尔值。y
:G_VARIANT_TYPE_BYTE
的类型字符串;字节。n
:G_VARIANT_TYPE_INT16
的类型字符串;有符号 16 位整数。q
:G_VARIANT_TYPE_UINT16
的类型字符串;无符号 16 位整数。i
:G_VARIANT_TYPE_INT32
的类型字符串;有符号 32 位整数。u
:G_VARIANT_TYPE_UINT32
的类型字符串;无符号 32 位整数。x
:G_VARIANT_TYPE_INT64
的类型字符串;有符号 64 位整数。t
:G_VARIANT_TYPE_UINT64
的类型字符串;无符号 64 位整数。h
:G_VARIANT_TYPE_HANDLE
的类型字符串;一个有符号 32 位值,根据约定,它被用作对文件描述符数组的索引,这些文件描述符与 D-Bus 消息一起发送。d
:G_VARIANT_TYPE_DOUBLE
的类型字符串;双精度浮点数值。s
:G_VARIANT_TYPE_STRING
的类型字符串;字符串。o
:G_VARIANT_TYPE_OBJECT_PATH
的类型字符串;以 D-Bus 对象路径形式出现的字符串。g
:G_VARIANT_TYPE_SIGNATURE
的类型字符串;以 D-Bus 类型签名形式出现的字符串。?
:G_VARIANT_TYPE_BASIC
的类型字符串;一个不确定类型,是任何基本类型的一个超类型。v
:G_VARIANT_TYPE_VARIANT
的类型字符串;一个容器类型,其中包含任何其他类型的值。a
:用作另一个类型字符串的前缀,表示该类型的数组;例如,类型字符串ai
是有符号 32 位整数数组的类型。m
:用作另一个类型字符串的前缀,表示该类型的“可能”或“可空”版本;例如,类型字符串ms
是一个值类型,它可能包含一个字符串,也可能不包含任何内容。()
:用于将零个或多个其他连接的类型字符串括起来,以创建一个元组类型;例如,类型字符串(is)
是一个整数和一个字符串的对类型。r
:G_VARIANT_TYPE_TUPLE
的类型字符串;一个不确定类型,是任何元组类型的一个超类型,无论项目数量是多少。{}
:用于将一个基本类型字符串与另一个类型字符串连接起来,以创建一个字典条目类型,它通常出现在数组中以形成字典;例如,类型字符串a{sd}
是一个字典的类型,它将字符串映射到双精度浮点数值。
第一种类型(基本类型)是键类型,第二种类型是值类型。第一种类型限制为基本类型的原因是可以轻松进行哈希。 - *
:G_VARIANT_TYPE_ANY
的类型字符串;是所有类型超类型的无限类型。请注意,与所有类型字符串一样,此字符表示一个类型。它不能用于元组内部,表示“任意数量的项目”。
包含无限类型的容器的任何类型字符串本身也是无限类型。例如,类型字符串 a*
(对应于 G_VARIANT_TYPE_ARRAY
)是一个无限类型,是每个数组类型的超类型。(*s)
是包含两个项目的元组的超类型,其中第二个项目是字符串。
a{?*}
是无限类型,是所有数组的超类型,其中字典项的键是任何基本类型,值是任何类型。根据定义,这是一个字典,因此此类型字符串对应于 G_VARIANT_TYPE_DICTIONARY
。请注意,由于字典项的键必须是基本类型的限制,因此 {**}
不是有效的类型字符串。
自 2.24 起可用