Когда тип регистрируется системой типов в glib? - PullRequest
1 голос
/ 26 сентября 2019

В настоящее время я работаю над библиотекой, и натолкнулся на некоторые странные несоответствия в поведении между моим модульным тестовым кодом и реальным приложением, в основе которого лежит код.

Видите, я пытаюсьчтобы получить Type структуру из имени класса, который я хочу создать, но я ничего не получаю (например, Тип есть, но name() производит null, is_a() терпит неудачу и т. д.)

Однако, если я сначала создаю экземпляр типа, а затем пытаюсь получить тип на основе имени еще раз, он работает так, как я ожидал (возможно, именно поэтому мои модульные тесты работают)

Так что я былинтересно, когда тип зарегистрирован системой типов и доступен через.from_name(...)?

Знает ли система типов ее только после того, как она была создана во время выполнения?Есть ли другая причина, по которой имя класса не будет распознано, пока не будет создан экземпляр класса?Должен ли я использовать какой-то другой метод регистрации?

Я пишу код на Вала, если это что-то меняет.

1 Ответ

3 голосов
/ 26 сентября 2019

Тип впервые регистрируется в системе типов при вызове функции get_type().Это вызывается во многих местах, в основном, когда вам нужно получить GType для этого типа.Как правило, он сначала вызывается во время class_init типа, что происходит во время первого экземпляра init.

Так что, по сути, вы правы, когда говорите «система типов знает это только после того, какбыл создан во время выполнения », потому что обычно так и происходит.Однако вы можете продвинуть регистрацию типов, явно вызвав функцию get_type() для типа раньше и передав ее g_type_ensure().Например, посмотрите, что делает GLib здесь :

/* Initialize types from built-in "modules" */
g_type_ensure (g_null_settings_backend_get_type ());
g_type_ensure (g_memory_settings_backend_get_type ());
g_type_ensure (g_keyfile_settings_backend_get_type ());
…
...