Получить строковое значение из значения KeySym - PullRequest
0 голосов
/ 09 января 2020

Есть ли способ получить строковое значение из значения KeySym? Например, из keyPrintable("a").

1 Ответ

2 голосов
/ 09 января 2020

Если вы знаете, что значение KeySym равно keyPrintable, вы можете просто получить его, используя свойство key. Например,

KeySym kv = ... // something that yields a KeySym
str s = kv.key;

Если вы не знаете, что это keyPrintable, вы можете либо проверить, был ли он построен с использованием этого конструктора, либо использовать сопоставление с образцом. Итак, либо

if (kv is keyPrintable) {
  // code that uses kv.key to get back the value
}

, либо

if (keyPrintable(str s) := kv) {
  // code that can now use s, which is the key
}

Вы также можете спросить, есть ли у kv это поле, а затем использовать его:

if (kv has key) {
  // code that uses kv.key
}

Как только вы введете имя поля в конструкторе, и оно имеет определенный тип c, вы знаете, что то же имя поля имеет тот же тип в любых дополнительных конструкторах для того же типа данных. Итак, когда мы знаем, что поле key имеет тип str, поле key должно быть str в любом значении типа KeySym. Вот почему хорошо видеть, если kv имеет поле key, а затем обрабатывать его как str, никто не сможет прийти позже и добавить новый конструктор для KeySym, где key имеет другой тип.

...