我有几个枚举。它们中的每一个都有数字标签,可以转换为整数(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));
}
显然问题出在process
,v as isize
无法使用
错误:非标量演员:
T
为isize
所以我想做一些像
这样的事情process<T: Process + scalar>
或
process<T: Process + ToPrimitive>
或者告诉编译器只允许强制转换为isize的类型的东西,但我不知道那是什么。
答案 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旨在用作没有任何方法的特征的超级