当循环遍历一个结构片段时,我得到的值是一个引用(这很好),但是在某些情况下,必须var像(*var)在很多地方一样编写它是很烦人的.
有没有更好的方法来避免重新声明变量?
fn my_fn(slice: &[MyStruct]) {
for var in slice {
let var = *var; // <-- how to avoid this?
// Without the line above, errors in comments occur:
other_fn(var); // <-- expected struct `MyStruct`, found reference
if var != var.other {
// ^^ trait `&MyStruct: std::cmp::PartialEq<MyStruct>>` not satisfied
foo();
}
}
}
Run Code Online (Sandbox Code Playgroud)
请参阅:实际错误输出(更加神秘).
通过将我的Score4 AI引擎移植到它,我一直在玩Rust - 基于我在OCaml中的功能风格实现.我特别想看看Rust如何使用功能风格的代码.
最终结果:它工作正常,速度非常快 - 比OCaml快得多.它几乎触及了命令式C/C++的速度 - 这真的很酷.
但是有一件事让我很烦恼 - 为什么我在这段代码的最后一行需要两个&符?
let moves_and_scores: Vec<_> = moves_and_boards
.iter()
.map(|&(column,board)| (column, score_board(&board)))
.collect();
let target_score = if maximize_or_minimize {
ORANGE_WINS
} else {
YELLOW_WINS
};
if let Some(killer_move) = moves_and_scores.iter()
.find(|& &(_,score)| score==target_score) {
...
Run Code Online (Sandbox Code Playgroud)
我添加它们是因为编译错误"引导"了我; 但我试图理解为什么......我使用Stack Overflow中其他地方提到的技巧来"询问"编译器告诉我什么类型的东西:
let moves_and_scores: Vec<_> = moves_and_boards
.iter()
.map(|&(column,board)| (column, score_board(&board)))
.collect();
let () = moves_and_scores;
Run Code Online (Sandbox Code Playgroud)
...导致此错误:
src/main.rs:108:9: 108:11 error: mismatched types:
expected `collections::vec::Vec<(u32, i32)>`,
found `()`
(expected struct `collections::vec::Vec`,
found ()) [E0308] …Run Code Online (Sandbox Code Playgroud) 我在这里有两个问题.
let a = [1, 2, 3];
assert_eq!(a.iter().find(|&&x| x == 2), Some(&2));
assert_eq!(a.iter().find(|&&x| x == 5), None);
Run Code Online (Sandbox Code Playgroud)
1.为什么&&x在闭包参数中使用而不仅仅是x?(我理解"&"正在传递一个对象的引用,但是两次使用它的意思是什么?)
这本书写道:
因为find()接受引用,并且许多迭代器遍历引用,这导致可能令人困惑的情况,其中参数是双引用.您可以在下面的示例中看到此效果,使用&& x.
但我真的不明白.
2.为什么&用而不是find()?
我在使用Iterator'sflat_map函数时遇到了困难,我不太确定如何理解和解决这个编译器错误。
我通过序列化两个结构将文件路径列表 flat_mapping 成两个字符串:
let body: Vec<String> = read_dir(query.to_string())
.iter()
.enumerate()
.flat_map(|(i, path)| {
let mut body: Vec<String> = Vec::with_capacity(2);
let entry = Entry { i };
body.push(serde_json::to_string(&entry).unwrap());
let record = parse_into_record(path.to_string()).unwrap();
body.push(serde_json::to_string(&record).unwrap());
body.iter()
})
.collect();
Run Code Online (Sandbox Code Playgroud)
error[E0277]: a value of type `std::vec::Vec<std::string::String>` cannot be built from an iterator over elements of type `&std::string::String`
--> src/main.rs:275:10
|
275 | .collect();
| ^^^^^^^ value of type `std::vec::Vec<std::string::String>` cannot be built from `std::iter::Iterator<Item=&std::string::String>`
|
= help: the trait `std::iter::FromIterator<&std::string::String>` …Run Code Online (Sandbox Code Playgroud) 我正在实现一个包含结构向量的集合类型。我想实现一堆方法来以各种方式对向量进行排序。每个函数返回一个值的集合很重要,因为调用站点将进一步修改结果,这可能意味着删除或更改值,并且这些更改都不应传播回原始集合。
该结构非常基本:
#[derive(PartialEq, Debug, Clone)]
pub struct Shoe {
size: u32,
style: String,
}
Run Code Online (Sandbox Code Playgroud)
集合类型只是将结构体包装成向量,如下所示:
#[derive(Debug, PartialEq, Clone)]
pub struct ShoesInventory {
shoes: Vec<Shoe>
}
Run Code Online (Sandbox Code Playgroud)
我想根据给定的尺寸过滤所有现有的鞋子,并将结果作为单独的向量返回。基本上就是迭代、过滤和收集。然而,当我写下这篇文章时,
impl ShoesInventory {
pub fn new(shoes: Vec<Shoe>) -> ShoesInventory {
ShoesInventory { shoes }
}
pub fn shoes_in_size(&self, shoe_size: u32) -> Vec<Shoe> {
self.shoes.iter().filter(| s| s.size == shoe_size).collect()
}
}
Run Code Online (Sandbox Code Playgroud)
我收到以下编译器错误
#[derive(PartialEq, Debug, Clone)]
pub struct Shoe {
size: u32,
style: String,
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试克隆闭包中的元素,它不会修复任何问题,并且仍然会出现相同的错误。目前还不清楚这个代码模式实际工作的另一个向量上的问题是什么。例如,当您使用另一个具有原始类型的向量(例如整数)时,迭代器、映射/过滤器、收集模式就可以正常工作。
let v1: Vec<i32> = vec![1, 2, 3];
let v2: Vec<_> …Run Code Online (Sandbox Code Playgroud) 请考虑以下代码段:
fn example(current_items: Vec<usize>, mut all_items: Vec<i32>) {
for i in current_items.iter() {
let mut result = all_items.get_mut(i);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨i是&mut usize不是usize:
error[E0277]: the trait bound `&usize: std::slice::SliceIndex<[()]>` is not satisfied
--> src/lib.rs:3:36
|
3 | let mut result = all_items.get_mut(i);
| ^^^^^^^ slice indices are of type `usize` or ranges of `usize`
|
= help: the trait `std::slice::SliceIndex<[()]>` is not implemented for `&usize`
Run Code Online (Sandbox Code Playgroud)
我已经挖掘了文档但是我认为满足编译器的唯一方法是i.clone().
我肯定错过了一些明显的东西.从值原始类型引用复制的惯用方法是什么?