结构体

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 当然可以实例化,您可以说 GtkWindowGtkWidget(因为 GtkWindowGtkWidget 的子类)。

两个类型不能按值比较;使用 g_variant_type_equal()g_variant_type_is_subtype_of() 可以使用 g_variant_type_copy() 复制,使用 g_variant_type_free() 释放。

GVariant 类型字符串

GVariant 类型字符串可以是以下任意一种

  • 任何基本类型字符串(在下方列出)
  • vr*
  • 字符 am 之一,后跟另一个类型字符串
  • 字符 (,后跟零个或更多其他类型字符串的连接,后跟字符 )
  • 字符 {,后跟基本类型字符串(参见下方),后跟另一个类型字符串,后跟字符 }

基本类型字符串描述基本类型(根据 g_variant_type_is_basic()),并且其长度始终为单个字符。有效的基本类型字符串有 bynqiuxthdsog?

上面的定义对任意深度进行了递归。aaaaai(ui(nq((y)))s) 都是有效的类型字符串,a(aa(ui)(qna{ya(yd)})) 也是如此。为了避免达到内存限制,GVariant 对 65 个嵌套容器的递归深度施加了限制。这是 D-Bus 规范 (64) 中的限制,外加一个以允许将 GDBusMessage 嵌套在顶级元组中。

每个字符的含义如下

  • bG_VARIANT_TYPE_BOOLEAN 的类型字符串;布尔值。
  • yG_VARIANT_TYPE_BYTE 的类型字符串;字节。
  • nG_VARIANT_TYPE_INT16 的类型字符串;有符号 16 位整数。
  • qG_VARIANT_TYPE_UINT16 的类型字符串;无符号 16 位整数。
  • iG_VARIANT_TYPE_INT32 的类型字符串;有符号 32 位整数。
  • uG_VARIANT_TYPE_UINT32 的类型字符串;无符号 32 位整数。
  • xG_VARIANT_TYPE_INT64 的类型字符串;有符号 64 位整数。
  • tG_VARIANT_TYPE_UINT64 的类型字符串;无符号 64 位整数。
  • hG_VARIANT_TYPE_HANDLE 的类型字符串;一个有符号 32 位值,根据约定,它被用作对文件描述符数组的索引,这些文件描述符与 D-Bus 消息一起发送。
  • dG_VARIANT_TYPE_DOUBLE 的类型字符串;双精度浮点数值。
  • sG_VARIANT_TYPE_STRING 的类型字符串;字符串。
  • oG_VARIANT_TYPE_OBJECT_PATH 的类型字符串;以 D-Bus 对象路径形式出现的字符串。
  • gG_VARIANT_TYPE_SIGNATURE 的类型字符串;以 D-Bus 类型签名形式出现的字符串。
  • ?G_VARIANT_TYPE_BASIC 的类型字符串;一个不确定类型,是任何基本类型的一个超类型。
  • vG_VARIANT_TYPE_VARIANT 的类型字符串;一个容器类型,其中包含任何其他类型的值。
  • a:用作另一个类型字符串的前缀,表示该类型的数组;例如,类型字符串 ai 是有符号 32 位整数数组的类型。
  • m:用作另一个类型字符串的前缀,表示该类型的“可能”或“可空”版本;例如,类型字符串 ms 是一个值类型,它可能包含一个字符串,也可能不包含任何内容。
  • ():用于将零个或多个其他连接的类型字符串括起来,以创建一个元组类型;例如,类型字符串 (is) 是一个整数和一个字符串的对类型。
  • rG_VARIANT_TYPE_TUPLE 的类型字符串;一个不确定类型,是任何元组类型的一个超类型,无论项目数量是多少。
  • {}:用于将一个基本类型字符串与另一个类型字符串连接起来,以创建一个字典条目类型,它通常出现在数组中以形成字典;例如,类型字符串 a{sd} 是一个字典的类型,它将字符串映射到双精度浮点数值。

第一种类型(基本类型)是键类型,第二种类型是值类型。第一种类型限制为基本类型的原因是可以轻松进行哈希。 - *G_VARIANT_TYPE_ANY 的类型字符串;是所有类型超类型的无限类型。请注意,与所有类型字符串一样,此字符表示一个类型。它不能用于元组内部,表示“任意数量的项目”。

包含无限类型的容器的任何类型字符串本身也是无限类型。例如,类型字符串 a*(对应于 G_VARIANT_TYPE_ARRAY)是一个无限类型,是每个数组类型的超类型。(*s) 是包含两个项目的元组的超类型,其中第二个项目是字符串。

a{?*} 是无限类型,是所有数组的超类型,其中字典项的键是任何基本类型,值是任何类型。根据定义,这是一个字典,因此此类型字符串对应于 G_VARIANT_TYPE_DICTIONARY。请注意,由于字典项的键必须是基本类型的限制,因此 {**} 不是有效的类型字符串。

自 2.24 起可用

构造函数

g_variant_type_new

创建一个新的 GVariantType,对应于 type_string 给出的类型字符串。

since: 2.24

g_variant_type_new_array

构造对应于类型 type 的元素数组的类型。

g_variant_type_new_dict_entry

构造对应于键类型为 key,值类型为 value 的字典项的类型。

g_variant_type_new_maybe

构造对应于包含类型 typeNothing 的“maybe”实例的类型。

g_variant_type_new_tuple

items 构造一个新元组类型。

函数

g_variant_type_checked_
暂无描述。

g_variant_type_string_is_valid

检查 type_string 是否是有效的 GVariant 类型字符串

g_variant_type_string_scan

string 中扫描单个完整有效的 GVariant 类型字符串。

since: 2.24

实例方法

g_variant_type_copy

生成 GVariantType 的副本。

g_variant_type_dup_string

返回与 type 相对应的类型字符串的新分配副本。

g_variant_type_element

确定数组或“maybe”类型的元素类型。

g_variant_type_equal

比较 type1type2 的相等性。

g_variant_type_first

确定元组或字典项类型的第一个项目类型。

g_variant_type_free

释放使用 g_variant_type_copy()g_variant_type_new() 或其中一个容器类型构造函数分配的 GVariantType

g_variant_type_get_string_length

返回与给定的 type 相对应的类型字符串的长度。

g_variant_type_hash

计算哈希 type

g_variant_type_is_array

确定给定的 type 是否为数组类型。

g_variant_type_is_basic

确定给定的 type 是否为基本类型。

g_variant_type_is_container

确定给定的 type 是否为容器类型。

g_variant_type_is_definite

确定给定的 type 是否确定(即:不无限)。

g_variant_type_is_dict_entry

确定给定的 type 是否为字典项类型。

g_variant_type_is_maybe

确定给定的 type 是否为“maybe”类型。

g_variant_type_is_subtype_of

检查 type 是否是 supertype 的子类型。

g_variant_type_is_tuple

确定给定的 type 是否为 tuple 类型。

g_variant_type_is_variant

确定给定的 type 是否为 variant 类型。

g_variant_type_key

确定字典输入类型的键类型。

g_variant_type_n_items

确定 tuple 或字典条目类型中包含的项目数。

g_variant_type_next

确定 tuple 或字典条目类型的下一个项目类型。

g_variant_type_peek_string

返回一个和给定的 type 相对应的类型字符串。

g_variant_type_value

确定字典条目类型的 value 类型。