枚举的特征可转换为isize

时间:2015-03-17 20:47:29

标签: rust

我有几个枚举。它们中的每一个都有数字标签,可以转换为整数(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无法使用

进行编译
  

错误:非标量演员:Tisize

所以我想做一些像

这样的事情
process<T: Process + scalar>

process<T: Process + ToPrimitive>

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

1 个答案:

答案 0 :(得分:0)

为您的特征添加一个方法,将其强制转换为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旨在用作没有任何方法的特征的超级