我是Rust的新手,所以请放轻松!
我正在尝试编写一个简单的应用程序,该应用程序根据简单的列类型列表生成伪造的表格数据。
例如,具有创建假名称和年龄的函数:
fn name() -> String {
FirstName(EN).fake()
}
fn age() -> i64 {
rand::thread_rng().gen_range(0, 100)
}
但是,在尝试使用这些函数根据最终将动态提供的类型列表生成数据时,我在类型系统方面苦苦挣扎:
pub fn generate() {
let generators = vec!["age", "name"];
// generate each row
for _ in 1..10 {
// generate a value of the given type
for gen_type in generators.iter() {
// error[E0308]: match arms have incompatible types
let generator = match gen_type.as_ref() {
"age" => age,
"name" => name,
_ => println!("Error"),
};
let out = generator();
// eventually I'll want to add some further logic here
println!("{}", out);
}
}
}
我了解这个问题,
generator
变量需要具有静态类型,但是不确定如何进行?我应该在通用结构中封装
String
和i64
吗?还是可以以某种方式使用Box
?再次,对这个模糊的问题表示歉意-朝正确方向的指针(无双关语)将不胜感激!
最佳答案
简而言之,您需要多态性。
在Rust中,您可以选择两种不同的机制:
性状更为通用(!),但代价是更加复杂。通常,当两者都可以使用时,我会推荐枚举。
让我们将其应用于您的问题:
enum Property {
Age(i64),
Name(String),
}
fn name() -> Property {
Property::Name(FirstName(EN).fake())
}
fn age() -> Property {
Property::Age(rand::thread_rng().gen_range(0, 100))
}
请注意,现在两个函数具有相同的类型签名!
有关枚举的更多信息,请检查Rust Book。
关于rust - 使用Rust如何在返回不同类型的函数上执行一组通用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62022130/