首页 文章

如何使用生成器函数初始化Rust向量?

提问于
浏览
4

在语言之间跳跃可能会很痛苦 . 一种语言的习语“感觉很好”,并且开始在其他语言中寻找相同的习语 .

在F#中,有一种方法可以在生成器函数的帮助下初始化数组 . Array.init n generator . 现在,我跳到Rust一段时间,我想知道是否有类似的设施或者我是否必须创建自己这样的设施 .

学习Rust standard library documentation about vectors,我找不到任何类似于我要找的东西 .

// Looking for something similar to:
Vec<T>::init(n : usize, generator : F) -> Vec<T> 
    where F: Fn(usize) -> T {
    // ...
}

也许它通过迭代器在Rust中的工作方式不同 . 但我必须承认,Rust迭代器(以及它们无数的味道)对我的简单思想来说仍然有点模糊 .

2 回答

  • 11

    您可以使用带有 maprange 然后收集结果 .

    就像在 F# docs的示例中一样:

    let my_vector : Vec<i32> = (1..11).map(|x| x*x).collect();
    

    检查这个live example

  • 4

    虽然@Netwave提供了答案,但我指出了一个使用它的解决方案,它提供了更多的可重用性和可读性 .

    fn initialize<T>(count: usize, f: fn(usize) -> T) -> Vec<T> {
        (0..count).map(f).collect()
    }
    
    fn main() {
        let my_vector = initialize(10, |i| i as i32);
        for e in my_vector {
             println!("{}", e);
        }
    }
    
    • 定义一个特征,为你想要的任何东西实现它并使用它,playground
    trait Initializer<T> {
        fn initialize(count: usize, f: fn(usize) -> T) -> Vec<T> {
            (0..count).map(f).collect()
        }
    }
    
    impl<T> Initializer<T> for Vec<T> {}
    
    fn main() {
        let my_vector = Vec::initialize(10, |i| i as i32);
        for e in my_vector {
            println!("{}", e);
        }
    }
    

    more general way

    trait Initializer<T, U> {
        fn initialize(count: usize, f: fn(usize) -> U) -> T;
    }
    
    impl<T: std::iter::FromIterator<U>, U> Initializer<T, U> for T {
        fn initialize(count: usize, f: fn(usize) -> U) -> T {
            (0..count).map(f).collect::<T>()
        }
    }
    
    fn main() {
        let my_vector = Vec::initialize(10, |i| i as i32);
        for e in my_vector {
            println!("{}", e);
        }
    }
    
    macro_rules! vec_init {
        ($count: expr, $f: expr) => { (0..$count).map($f).collect() }
    }
    
    fn main() {
        let my_vector: Vec<i32> = vec_init!(10, |i| i as i32);
    }
    

    基础仍然是@ Netwave的答案 . 你问过你想要的东西:

    // Looking for something similar to:
    Vec<T>::init(n : usize, generator : F) -> Vec<T> 
        where F: Fn(usize) -> T {
        // ...
    }
    

    并且在第二项中确实存在此代码 .

相关问题