Rust 在局部函数中捕获局部变量

Rust 在局部函数中捕获局部变量,rust,Rust,我有一个类似迷宫的东西,里面有两个点,我想要这些点之间的距离通过迷宫。为此,我将使用*(除非有更好的算法我不知道),但要使用*我需要我的SN(搜索节点)结构来实现Ord特性。我想使用从一个位置到另一个位置的曼哈顿距离作为启发,所以我有这样的代码(): 这不起作用,因为未捕获to变量: 错误[E0434]:无法捕获fn项中的动态环境 -->src/main.rs:13:34 | 13 |让tc=self.step+我需要的东西在cmp中; |

我有一个类似迷宫的东西,里面有两个点,我想要这些点之间的距离通过迷宫。为此,我将使用*(除非有更好的算法我不知道),但要使用*我需要我的
SN
(搜索节点)结构来实现
Ord
特性。我想使用从一个位置到另一个位置的曼哈顿距离作为启发,所以我有这样的代码():

这不起作用,因为未捕获
to
变量:

错误[E0434]:无法捕获fn项中的动态环境
-->src/main.rs:13:34
|
13 |让tc=self.step+我需要的东西在cmp中;
|                                  ^^^^^^^^^^^^^^^^^^^^^^^
|
=帮助:改用`|{…}`闭包形式
错误[E0434]:无法捕获fn项中的动态环境
-->src/main.rs:14:35
|
14 |让oc=other.step+cmp中需要的东西;
|                                   ^^^^^^^^^^^^^^^^^^^^^^^
|
=帮助:改用`|{…}`闭包形式
错误[E0277]:无法将'SN'与'SN'进行比较`
-->src/main.rs:11:10
|
11 |对序列号的请求{
|^^^没有实现'SNSN`
|
=帮助:没有为'SN'实现特性'PartialOrd'`
错误[E0277]:不满足特征绑定'SN:Eq'
-->src/main.rs:11:10
|
11 |对序列号的请求{
|^^^没有为'SN'实现特性'Eq'`
这有什么办法吗

  • 错误提示
    改用`|{…}`闭包形式
    ,但我似乎无法正确执行此操作。这有助于解决此问题吗

  • 我在网上找到的一个答案建议将额外的数据(在我的例子中是
    to
    变量)添加到结构中(这里是
    SN
    ),但对于这样的搜索,这意味着
    to
    变量(或对它的引用)被复制了100次,这是没有效率的


  • 在我看来,您希望对点使用动态排序,但这里的大问题是,
    Ord
    (以及所有其他生锈特性)需要在编译时静态定义

    我的建议是,不要在代码中使用裸
    SN
    结构,而是使用带有距离的
    SN
    结构,即
    (u32,SN)
    。这些元组派生
    Ord
    ,因此它们应该在优先级队列中工作,等等

    对于
    (距离,SN)
    技巧,您仍然需要一个
    impl-Ord for SN
    实现。好消息是,任何任意
    Ord
    定义,包括默认定义(
    #[派生(…)]
    )都可以工作

    use std::cmp::Ordering;
    
    fn main() {
        let something_i_need_in_cmp = 5;
    
        #[derive(Eq, PartialEq, Ord, PartialOrd)]
        struct SN {
            loc: u16,
            step: u16,
        }
            
    }
    

    @Shepmaster我想我的代码片段非常清楚,但为了回答你的问题,我没有使用板条箱,没有货物,只有标准的Ord库使用
    std::cmp::Ordering
    。我用一个简化的代码创建了一个Rust Playway链接:我还添加了编译器的确切错误(你也可以在Playway中看到)看起来你的问题可能会由的答案来回答。如果不是,请你的问题解释差异。否则,我们可以将这个问题标记为已回答。@Shepmaster我看到了那篇帖子,它接近于同一个问题,但我尝试了那里的答案,但它们对我没有帮助,而NovaDenizen实际上帮了我一个good answerOh,也是@Shepmaster,通过您对问题的某些部分所做的编辑,现在已经没有意义了(比如我对“to”变量的引用),在我看来,我最初的问题比现在更好,但也许这只是我的观点,我尝试过这个,但它不起作用,我的猜测是SN仍然需要
    Ord
    ,因为它们在元组中,但不管怎样,编译器仍然抱怨SN需要
    Ord
    。至于“动态排序”,我只想使用priority队列,我可以只为一个序列号分配1个权重(这样可以使它显式地不是动态的)但是Rust std优先级队列似乎希望我使用
    Ord
    。如果元组像这样工作,我会很高兴,但他们不允许SN不实现
    Ord
    @KoenduBuf抱歉,我在回答中留下了一个重要的部分。我已经编辑了它。谢谢,有了额外的部分,我会接受这个答案:D
    use std::cmp::Ordering;
    
    fn main() {
        let something_i_need_in_cmp = 5;
    
        #[derive(Eq, PartialEq, Ord, PartialOrd)]
        struct SN {
            loc: u16,
            step: u16,
        }
            
    }