【问题标题】:Trait for enums convertible to isize可转换为 isize 的枚举的特征
【发布时间】:2015-03-18 05:10:40
【问题描述】:

我有几个枚举。它们每个都有数字标签,可以转换为整数 (isize)。我有一个他们都定义的特质。但是该特征的实例不再可以转换为整数,因为编译器无法证明所有实现实际上都是无参数枚举。

是否有任何特征意味着类型是无参数枚举或可转换为整数(通过任何方式),我可以在需要获取数值的泛型中用作约束?


更具体地说,这是一个代码示例 (also on play):

enum Foo {
    a = 1,
    b = 2,
    c = 3,
}

enum Bar {
    d = 4,
    e = 5,
    f = 6,
}

trait Process : std::marker::MarkerTrait {
    fn process(v: isize) -> String;
}

impl Process for Foo {
    fn process(v: isize) -> String { format!("foo{}", v) }
}

impl Process for Bar {
    fn process(v: isize) -> String { format!("bar{}", v) }
}

// just for sake of argument; something more complex in reality, of course
fn extern_call(v: isize) -> isize { 2 * v + 211 }

fn process<T: Process>(v: T) -> String {
    T::process(extern_call(v as isize))
}

fn main() {
    println!("a: {}", process(Foo::a));
}

显然问题出在processv as isize 编译失败

错误:非标量转换:T as isize

所以我想做类似的事情

process<T: Process + scalar>

process<T: Process + ToPrimitive>

或者告诉编译器只允许转换为 isize 的类型,但我不知道那可能是什么。

【问题讨论】:

    标签: rust


    【解决方案1】:

    为你的 trait 添加一个方法,将其强制为 isize。然后编译器可以验证对象是否满足要求的条件:

    enum Foo {
        A = 1,
        B = 2,
        C = 3,
    }
    
    enum Bar {
        D = 4,
        E = 5,
        F = 6,
    }
    
    trait Process: {
        fn as_isize(self) -> isize;
        fn process(v: isize) -> String;
    }
    
    impl Process for Foo {
        fn as_isize(self) -> isize { self as isize }
        fn process(v: isize) -> String { format!("foo{}", v) }
    }
    
    impl Process for Bar {
        fn as_isize(self) -> isize { self as isize }
        fn process(v: isize) -> String { format!("bar{}", v) }
    }
    
    // just for sake of argument; something more complex in reality, of course
    fn extern_call(v: isize) -> isize { 2 * v + 211 }
    
    fn process<T: Process>(v: T) -> String {
        T::process(extern_call(v.as_isize()))
    }
    
    fn main() {
        println!("a: {}", process(Foo::A));
    }
    

    仅供参考,这里不需要MarkerTrait(并且不习惯):

    MarkerTrait 旨在用作没有任何方法的特征的超特征

    【讨论】:

    • 当然,这是显而易见的解决方案。当有 15 个左右的枚举时,它也不是很好。
    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 2020-08-21
    相关资源
    最近更新 更多