Rust 递归探索多维向量
我现在正在学习生锈。我正在尝试转换一个小项目写在一个动态的语言,因为我学习。我遇到了一个问题,我正在努力寻找解决办法 我希望递归地访问n维向量的每个元素 以下是问题的一般代码:Rust 递归探索多维向量,rust,Rust,我现在正在学习生锈。我正在尝试转换一个小项目写在一个动态的语言,因为我学习。我遇到了一个问题,我正在努力寻找解决办法 我希望递归地访问n维向量的每个元素 以下是问题的一般代码: explore(collection) { for item in collection { if item is Collection { explore(item) } else { operate(item)
explore(collection) {
for item in collection {
if item is Collection {
explore(item)
}
else {
operate(item)
}
}
}
我使用的是rustc 1.0.0(a59de37e9 2015-05-13)(2015-05-14版)
感觉如果不使用不安全的代码(我还没有学会),这是不可能的
我的问题如下:
对。有几种方法可以做到这一点,但没有更多细节,我只建议以下相对简单的方法:
//在Rust中,更喜欢使用枚举而不是动态分派。
枚举项{
收集(Vec),
值(T),
}
//该explore函数在所存储的类型(T)和,
//以及对值执行的操作。
fn探索(集合:&[项目],操作:&多功能)
其中F:FnMut(&T){
对于集合中的项目{
比赛项目{
&项目::收集(参考项目)=>探索(项目,操作),
&项目::值(参考值)=>操作(值)
}
}
}
fn操作\u i32(值:&i32){
println!(“操作({})”,值;
}
fn main(){
使用项目::*;
让root=vec[
值(1),
收藏(vec[
值(2),
值(3),
]),
值(4),
];
探索(&root,&mut操作\u i32)
}
在铁锈书中关于和的章节中可以找到进一步的相关阅读。与简单的朴素的
&F
/FnMut
相比,使用&F
/Fn
有什么好处?F:FnMut
更广泛地有用。这样看:没有特别的理由不允许改变其环境的闭包,所以我们最好允许它们F:Fn
也不是很简单,只是不同而已。一个不同的特性,它只需要一个不可变的指针,而不是一个可变的指针。explore
函数的语义非常简单,指针是可变的,甚至不会带来不便/耸耸肩
我们可以调用几次&mut operation\u i32
?这不应该为其他调用锁定函数吗?但我明白你的意思。如果我知道向量是齐次的,唯一未知的是维数,那么有可能避免枚举包装吗?例如Vec
或Vec
@tafia:在这种情况下,没有。除了调用explore
之外,没有任何东西可以保存借阅。我们借了一本书,把它传给《探索》,然后它就走了。