把GLib.Array放在GLib.Value中?

时间:2018-03-17 19:38:26

标签: glib vala

我无法弄清楚如何在GLib.Value中包装GLib.Array。

我尝试了这段代码。

public int main (string[] args) {
  var value = Value(typeof (Array));

  var a = new Array<string>();
  a.append_val("test");
  value.set_object((Object) a);

  return 0;
}

但它导致了这些错误。

(process:1797): GLib-GObject-WARNING **: invalid uninstantiatable type '(null)' in cast to 'GObject'
(process:1797): GLib-GObject-CRITICAL **: g_value_set_object: assertion 'G_VALUE_HOLDS_OBJECT (value)' failed

2 个答案:

答案 0 :(得分:0)

我认为GValue被用作单一类型值的容器,而GArray是一个集合。 GValue确实有type_compatible ()方法。在代码显示GLib之前使用该方法作为检查不允许将GArray存储为GObject:

public int main (string[] args) {
  if (!Value.type_compatible (typeof (Array), typeof (Object))) {
    message ("Incompatible types");
    return 1;
  }

  var value = Value(typeof (Array));

  var a = new Array<string>();
  a.append_val("test");
  value.set_object((Object) a);

  return 0;
}

此代码停止检查兼容类型的位置。

我不知道你想要实现什么,但我建议看看GVariant:

void main () {
    string[] a = {"test"};
    Variant variant = a;
    print (variant.print(true) + "\n");
}

如果您需要GValue,则可以使用GValue的take_variant ()方法将GVariant存储在GValue中。

答案 1 :(得分:0)

GArray不是GObject。但是,它是boxed typeGValue中使用的类型标记的更原始版本),因此您应该能够使用GValue将其存储在value.set_boxed (a)中。< / p>