当前位置: 首页 > 知识库问答 >
问题:

关于rust 所有权转移与Option中的take()方法的疑问?

白高超
2024-12-15

这是leetcode中的206反转链表,问题如代码中的注释所示,prev = curr会转移curr的所有权,但后面又能给curr赋值,而let mut next = node.next(不加.take())转移node.next的所有权后,node.next却不能再使用,也就是在node.next = prev时会提示node.next已经被移动

// Definition for singly-linked list.
// #[derive(PartialEq, Eq, Clone, Debug)]
// pub struct ListNode {
//   pub val: i32,
//   pub next: Option<Box<ListNode>>
// }
// 
// impl ListNode {
//   #[inline]
//   fn new(val: i32) -> Self {
//     ListNode {
//       next: None,
//       val
//     }
//   }
// }
impl Solution {
    pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        let mut prev = None;
        let mut curr = head;
        while let Some(ref mut node) = curr {
            let mut next = node.next.take();    // 为什么这里需要take(),而下面的prev = curr却不需要呢
            node.next = prev;
            prev = curr;    // 由于 curr 是可变的,所以即使这里转移所有权后,它依然可以用下面的语句修改?
            curr = next;
        }
        prev
    }
}

共有1个答案

阎功
2024-12-15

没有 take 的话:

Line 22: Char 28: error: cannot move out of `node.next` which is behind a mutable reference (solution.rs)
   |
22 |             let mut next = node.next;    // 为什么这里需要take(),而下面的prev = curr却不需要呢
   |                            ^^^^^^^^^ move occurs because `node.next` has type `Option<Box<list_node::ListNode>>`, which does not implement the `Copy` trait
   |
help: consider borrowing here
   |
22 |             let mut next = &node.next;    // 为什么这里需要take(),而下面的prev = curr却不需要呢
   |                            +
help: consider cloning the value if the performance cost is acceptable
   |
22 |             let mut next = node.next.clone();    // 为什么这里需要take(),而下面的prev = curr却不需要呢
   |                                     ++++++++

For more information about this error, try `rustc --explain E0507`.
error: could not compile `prog` (bin "prog") due to 1 previous error

这里是不能转移所有权的,因为 node 是一个 borrow 。

 类似资料:
  • 如果运行上面的程序,会报错误 修复的方法可以是 这个问题应该是和 rust 所有权有关,当方法返回时会出现所有权移动。一开始认为可能是结构体内的字段无法移动所有权。但是执行 报错的原因应该是所有权移动后, animate.name 就失效了,按这么说结构体内的字段是可以移动所有权的。 那最上面的报错应该怎么比较好去理解?

  • 假设要写一个在后台启动线程的函数,想通过新线程返回的所有权去调用这个函数,而不是等待线程结束再去调用;或完全与之相反的想法:创建一个线程,并在函数中转移所有权,都必须要等待线程结束。总之,新线程的所有权都需要转移。 这就是移动引入std::thread的原因,C++标准库中有很多资源占有(resource-owning)类型,比如std::ifstream,std::unique_ptr还有std

  • 由于permissions API调用不返回所有者的电子邮件和名称,所以我无法通过编程方式查看文件列表并转移所有权。我希望不必添加数据库来查找姓名和电子邮件,并将其与供应API绑定在一起。 谢谢你的任何建议。

  • 结果: 问题: 1.lis,ele=>ele.textContent中我把ele.textContent换成了lis.textContent结果出来的是一个undefine的集合,是为什么? 2.lis,ele=>ele.textContent我是否可以理解为Array.from(arr,function),然后返回元素的文本内容? 3.该怎么理解lis和ele之间的关系呢?(因为看到很多案例都是

  • 本文向大家介绍Jquery遍历select option和添加移除option的实现方法,包括了Jquery遍历select option和添加移除option的实现方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Jquery遍历select option和添加移除option的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 以下代码在 chrome 输出 1,2,3 这个在网上找到了,forEach 一开始就已经获取了 数组长度 The range of elements processed by forEach is set before the first call to callbackfn. Elements which are appended to the array after the call to

  • 我使用LocalDateTime几乎导致了一个在线错误,直到例如: 我最初认为他应该2天回来,但结果是1天! 然后我看了看对应的源代码,我现在好像明白了:如果超过一天,不到两天,那就只返回一天。 我想问一下Java或Spring中是否有满足我需求的工具。 我想让它回到2天,这符合人们的直觉。 当然,我可以包装一个实用程序类来实现这一点,但我想知道Java中是否有可用的实现? 我的业务场景如下:如果