Если вы знаете, что значение 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
имеет другой тип.