在语言之间跳跃可能会很痛苦.一种语言的习语"感觉很好",并且开始在其他语言中寻找相同的习语.
在F#中,有一种方法可以在生成器函数的帮助下初始化数组.Array.init n generator.现在,我跳到Rust一段时间,我想知道是否有类似的设施或者我是否必须创建自己这样的设施.
研究关于向量的Rust标准库文档,我找不到类似于我正在寻找的东西.
// Looking for something similar to:
Vec<T>::init(n : usize, generator : F) -> Vec<T>
where F: Fn(usize) -> T {
// ...
}
Run Code Online (Sandbox Code Playgroud)
也许它通过迭代器在Rust中的工作方式不同.但我必须承认,Rust迭代器(以及它们无数的味道)对我的简单思想来说仍然有点模糊.
Net*_*ave 15
您可以使用rangewith a a map然后收集结果.
就像在F#docs 的例子中一样:
let my_vector : Vec<i32> = (1..11).map(|x| x*x).collect();
Run Code Online (Sandbox Code Playgroud)
查看此实例
尽管@Netwave提供了答案,但我还是指出了使用它并提供更高的可重用性和可读性的解决方案。
定义一个通用函数,Playground:
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);
}
}
Run Code Online (Sandbox Code Playgroud)定义一个特征,将其实现为所需的一切,并使用它,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);
}
}
Run Code Online (Sandbox Code Playgroud)
或更一般的方法:
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);
}
}
Run Code Online (Sandbox Code Playgroud)写一个宏,操场:
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);
}
Run Code Online (Sandbox Code Playgroud)@Netwave的答案中的基数仍然相同。您已经问过要这样的东西:
// Looking for something similar to:
Vec<T>::init(n : usize, generator : F) -> Vec<T>
where F: Fn(usize) -> T {
// ...
}
Run Code Online (Sandbox Code Playgroud)
在第二项中确实有此代码。
| 归档时间: |
|
| 查看次数: |
1768 次 |
| 最近记录: |