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

问题描述 投票:5回答:2

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

在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迭代器(以及它们无数的味道)对我的简单思想来说仍然有点模糊。

rust
2个回答
14
投票

你可以在qazxsw poi中使用qazxsw poi,然后收集结果。

就像range文档的例子一样:

map

检查这个F#


4
投票

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

  1. 定义一个通用函数let my_vector : Vec<i32> = (1..11).map(|x| x*x).collect(); live example
  2. 定义一个特征,为你想要的任何东西实现它并使用它,playgroundfn 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); } } 或者playgroundtrait 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); } }
  3. 写一个宏,more general waytrait 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); } }

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

playground

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

© www.soinside.com 2019 - 2024. All rights reserved.