【问题标题】:Vala, string to enumVala,字符串到枚举
【发布时间】:2021-08-28 10:16:49
【问题描述】:

有没有办法在vala中将字符串转换为枚举:

string foo = "Enum1";
MY_ENUM theEnum = MY_ENUM.get_value_by_name(foo);
enum MY_ENUM {
    Enum1,
    Enum2,
    Enum3
}

所以在本例中,“theEnum”的值为:MY_ENUM.Enum1

【问题讨论】:

    标签: string enums vala


    【解决方案1】:

    可以使用 GLib 的 GObject 库提供的运行时类型系统。有EnumClassEnumValue。它们在运行时提供自省,并允许从字符串初始化枚举。

    目前语法有点复杂,尽管有人可以修改 Vala 编译器以使其更容易,但这是一项重要的工作。

    一个例子:

    void main () {
        try {
            MyEnum? the_enum_value;
            the_enum_value = MyEnum.parse ("FIRST");
            print (@"$(the_enum_value)\n");
        } catch (EnumError error) {
            print (@"$(error.message)\n");
        }
    }
    
    errordomain EnumError {
        UNKNOWN_VALUE
    }
    
    enum MyEnum {
        FIRST,
        SECOND,
        THIRD;
    
        public static MyEnum parse (string value) throws EnumError {
            EnumValue? a;
            a = ((EnumClass)typeof (MyEnum).class_ref ()).get_value_by_name ("MY_ENUM_" + value);
            if (a == null) {
                throw new EnumError.UNKNOWN_VALUE (@"String $(value) is not a valid value for $(typeof(MyEnum).name())");
            }
            return (MyEnum)a.value;
        }
    }
    

    【讨论】:

    • 在这里使用刻痕可能会更好
    • 如果在打印值时需要一个更易于阅读的名称,昵称会有所帮助,但不确定从昵称字符串到值有多大帮助?有一些代码gitlab.gnome.org/GNOME/vala/-/commit/… 和讨论gitlab.gnome.org/GNOME/vala/-/issues/976
    • 我本可以在附加到枚举的函数中使用 switch 语句,但这似乎不是最好的主意,但毕竟我可能只使用 switch 语句,因为这个解决方案似乎也有点混乱.
    • 在与 GSettings 保持一致并作为 GAction 目标时使用昵称
    猜你喜欢
    • 2011-11-02
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多