GJS 中为数组定义 GObject 属性 的正确方法是什么?
What is the correct way in GJS to define a GObject property for an Array?
我在 GJS GObject overrides 中看到大多数类型的定义都对应于 Javascript 类型,但是我应该如何为标准字符串数组定义 属性?我想到的一些选项:
- 使用 TYPE_OBJECT 和一个 GList,但是当我检索它时 GJS 会把它映射到一个数组吗?
- 使用 TYPE_OBJECT 和类型为 "as" 的 GVariant 并自行解压
- 使用TYPE_BOXED和TYPE_ARRAY,但是TYPE_ARRAY和Javascript的数组类型有可比性吗?
这目前是不可能的。订阅 https://bugzilla.gnome.org/show_bug.cgi?id=727787 以在有进展时得到通知。
我过去曾成功使用第二个选项(类型为 as
的 GVariant)。 GList 选项将不起作用,因为 GJS 不注意存储在 GList 中的值的类型。第三个选项我不确定。
这是一个展示如何使用 GVariant 选项的最小示例:
const GObject = imports.gi.GObject;
const GLib = imports.gi.GLib;
const MyClass = GObject.registerClass({
Properties: {
'prop': GObject.param_spec_variant('prop', 'Prop', 'Prop',
new GLib.VariantType('as'), null,
GObject.ParamFlags.READABLE),
},
}, class MyClass extends GObject.Object {
get prop() {
return new GLib.Variant('as', ['one', 'two']);
}
});
print(new MyClass().prop.deep_unpack());
(如果您不使用新的 class 语法,它仍然以与旧的 Lang.Class
类似的方式工作。)
我在 GJS GObject overrides 中看到大多数类型的定义都对应于 Javascript 类型,但是我应该如何为标准字符串数组定义 属性?我想到的一些选项:
- 使用 TYPE_OBJECT 和一个 GList,但是当我检索它时 GJS 会把它映射到一个数组吗?
- 使用 TYPE_OBJECT 和类型为 "as" 的 GVariant 并自行解压
- 使用TYPE_BOXED和TYPE_ARRAY,但是TYPE_ARRAY和Javascript的数组类型有可比性吗?
这目前是不可能的。订阅 https://bugzilla.gnome.org/show_bug.cgi?id=727787 以在有进展时得到通知。
我过去曾成功使用第二个选项(类型为 as
的 GVariant)。 GList 选项将不起作用,因为 GJS 不注意存储在 GList 中的值的类型。第三个选项我不确定。
这是一个展示如何使用 GVariant 选项的最小示例:
const GObject = imports.gi.GObject;
const GLib = imports.gi.GLib;
const MyClass = GObject.registerClass({
Properties: {
'prop': GObject.param_spec_variant('prop', 'Prop', 'Prop',
new GLib.VariantType('as'), null,
GObject.ParamFlags.READABLE),
},
}, class MyClass extends GObject.Object {
get prop() {
return new GLib.Variant('as', ['one', 'two']);
}
});
print(new MyClass().prop.deep_unpack());
(如果您不使用新的 class 语法,它仍然以与旧的 Lang.Class
类似的方式工作。)