作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我声明了Lexer
特性:
trait Lexer<T> {}
另外,我已经为两种结构实现了它:
impl Lexer<A> for ContainerA {}
impl Lexer<B> for ContainerB {}
现在,我试图通过三元运算符声明变量:
let lexer: Lexer<?> = if args.mode == 0 { ContainerA::new() } else { ContainerB::new() };
当然,此代码是错误的,但是...如何正确编写?使用rust 推断出基于条件的通用类型。是否有可能?
Lexer
实现即可使用其方法。
最佳答案
您可以通过将其包装在Box
中来创建特征对象,以便在编译时知道其大小。
trait Lexer {
fn lex(&self);
}
struct ContainerA;
struct ContainerB;
impl Lexer for ContainerA {
fn lex(&self) {
println!("A");
}
}
impl Lexer for ContainerB {
fn lex(&self) {
println!("B");
}
}
根据您的条件,可以为
lexer
分配不同的特征对象。
let value = 0;
let lexer: Box<Lexer> = if value == 0 {
Box::new(ContainerA)
} else {
Box::new(ContainerB)
};
lexer.lex();
enum Container {
A(ContainerA),
B(ContainerB),
}
根据您的条件,您可以使用枚举值中的任何一个,同时为变量设置一个固定的类型:
let lexer: Container = if args.mode == 0 {
Container::A(ContainerA::new())
} else {
Container::B(ContainerB::new())
};
关于rust - 如何得出变量的通用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63500958/
这个问题在这里已经有了答案: Why are these constructs using pre and post-increment undefined behavior? (14 个答案) 关
我是一名优秀的程序员,十分优秀!