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

标签 rust

我是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/

    相关文章:

    rust - 为什么在使用非文字模式时无法访问此匹配模式?

    reference - Rust的确切自动引用规则是什么?

    rust - 包含文件后,柴油和火箭的进口就会中断

    enums - 我最接近通过 char 区分枚举的是什么?

    generics - 问号在类型参数绑定(bind)中意味着什么?

    rust - 从 Rust 中的方法返回字符串

    rust - 向结构体添加新的成员变量

    oop - 在 OOP Rust 中,值在构造函数和 setter 中的生命周期不够长

    rust - 如何跨平台获取文件的修改时间?

    rust - 如何从 env::var 返回匹配的值?