gpt4 book ai didi

rust - 使用Rust如何在返回不同类型的函数上执行一组通用操作

转载 作者:行者123 更新时间:2023-12-03 11:41:56 25 4
gpt4 key购买 nike

我是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变量需要具有静态类型,但是不确定如何进行?

我应该在通用结构中封装 Stringi64吗?还是可以以某种方式使用 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/

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