Как правильно в GJS определить свойство GObject для массива?

Я вижу в переопределения GJS GObject есть определения для большинства типов, соответствующих типам Javascript, но как мне определить свойство для стандартного массива строк? Некоторые варианты, которые пришли мне в голову:

  • использовать TYPE_OBJECT и GList, но сопоставит ли GJS это с массивом, когда я его получу?
  • используйте TYPE_OBJECT и GVariant с типом "as" и распакуйте его самостоятельно
  • используйте TYPE_BOXED и TYPE_ARRAY, но сопоставим ли TYPE_ARRAY с типом массива Javascript?

person andy.holmes    schedule 21.08.2017    source источник


Ответы (1)


В настоящее время это невозможно. Подпишитесь на https://bugzilla.gnome.org/show_bug.cgi?id=727787 чтобы получать уведомления о ходе выполнения.

Я успешно использовал второй вариант (GVariant с типом as) в прошлом. Опция 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());

(Если вы не используете новый синтаксис класса, он по-прежнему работает аналогично старому Lang.Class.)

person ptomato    schedule 24.08.2017
comment
В качестве продолжения, поскольку я предполагаю, что вы сохранили вариант как TYPE_OBJECT, могу ли я предположить, что невозможно иметь вариант as для экспорта в качестве свойства DBus as? Похоже, что ParamSpec для вариантов в GObject.js не доступен, и даже использование функции запаса, похоже, задыхается. - person andy.holmes; 17.09.2017
comment
Интересно, я последовал вашему примеру, но продолжал получать ошибку при вызове свойства через DBus Expected type utf8 for Argument 'strv' but got type 'object', пока я только что не вернул ['one', 'two'] из геттера. Это нормально, теперь это работает и внутри, без распаковки вариантов везде, спасибо. - person andy.holmes; 17.09.2017