gpt4 book ai didi

rust - 如何得出变量的通用类型?

转载 作者:行者123 更新时间:2023-12-03 11:44:52 24 4
gpt4 key购买 nike

我声明了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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com