相关疑难解决方法(0)

迭代切片的值而不是Rust中的引用?

当循环遍历一个结构片段时,我得到的值是一个引用(这很好),但是在某些情况下,必须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)

请参阅:实际错误输出(更加神秘).

iterator rust

13
推荐指数
2
解决办法
3308
查看次数

为什么find闭包的参数需要两个&符号?

通过将我的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)

reference rust

11
推荐指数
1
解决办法
1360
查看次数

为什么在这里使用"&&"?

在这里有两个问题.

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()

reference rust borrowing

9
推荐指数
1
解决办法
576
查看次数

无法从 `Iterator&lt;Item=&amp;String&gt;` 构建类型为 `Vec&lt;String&gt;` 的值的迭代器收集问题

我在使用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)

iterator rust

7
推荐指数
1
解决办法
7629
查看次数

为什么我得到 FromIterator&lt;&amp;T&gt;` is not Implemented for Vec&lt;T&gt;?

我正在实现一个包含结构向量的集合类型。我想实现一堆方法来以各种方式对向量进行排序。每个函数返回一个值的集合很重要,因为调用站点将进一步修改结果,这可能意味着删除或更改值,并且这些更改都不应传播回原始集合。

该结构非常基本:

#[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)

collections iterator functional-programming filter rust

2
推荐指数
1
解决办法
724
查看次数

通过值从原始类型引用复制的惯用方法是什么?

请考虑以下代码段:

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().

我肯定错过了一些明显的东西.从值原始类型引用复制的惯用方法是什么?

rust

1
推荐指数
2
解决办法
3091
查看次数