修改选择器时有没有办法在 Rust 中使用 match() ?

2023-12-05

这个问题的名字很糟糕,但基本上,考虑这个简单的例子:

您有一个以下形式的链接列表:

struct Node<T> {
    _next: Option<~Node<T>>,
    _data: Option<T>
}

以及将元素添加到链中的“推送”操作:

/** Attach a node as the 'next' node in this chain */
fn push<'a>(&'a mut self, value: T) -> &'a mut ~Node<T> {
    if (self._next.is_none()) {
        self._push_node(~Node::new(value));
    } else {
        let tmp = self._next.take().unwrap();
        let mut next = ~Node::new(value);
        next._push_node(tmp);
        self._push_node(next);
    }
    return self._next.as_mut().unwrap();
}

这是可行的,但感觉作为 match() 表达式而不是 if 语句会更简洁,如下所示:

/** Attach a node as the 'next' node in this chain */
fn push<'a>(&'a mut self, value: T) -> &'a mut ~Node<T> {
    match self._next {
        None => { self._push_node(~Node::new(value)); },
        Some(ref v)  => { <----------------------------- :(
            let tmp = self._next.take().unwrap(); <------- ???
            let mut next = ~Node::new(value);
            next._push_node(tmp);
            self._push_node(next);
        }
    }
    return self._next.as_mut().unwrap();
}

然而,由于上面指出的行,这不会起作用;实际上,我们正在修改 _next 的值,这是不可能发生的,因为我们借用了 self._next 作为 match 语句的 Some() 的范围。

有更好的方法吗?

您能否以某种方式将 match 语句纯粹声明为匹配,以便一旦您进入 Some() => { ... } 块,您就可以not借用价值?


因为Some(ref v), you were借用价值。然后你没有使用它,所以Some(_)本来就很好。但说实话,你do想要取值。所以你真正想要的是改变take()比赛之外。

这是最终结果:

pub struct Node<T> {
    next: Option<~Node<T>>,
    data: Option<T>
}

/** Attach a node as the 'next' node in this chain */
pub fn push<'a>(&'a mut self, value: T) -> &'a mut ~Node<T> {
    match self.next.take() {
        None => self.push_node(~Node::new(value)),
        Some(v) => {
            let mut next = ~Node::new(value);
            next.push_node(v);
            self.push_node(next);
        }
    }
    match self.next {
        Some(ref mut t) => t,
        None => unreachable!(),
    }
    // Sure, you could replace those four lines with self.next.as_mut().unwrap(),
    // but I have a slight leaning towards highlighting the unreachable nature of
    // the None branch. It makes it more explicit.
    // Others will doubtless disagree with me on that point.
}

你也可以去Some(ref mut v)并操纵了&mut ~Node<T>直接价值,但这可能需要改变如何push_node作品。 (您还没有显示它的代码,所以我只能猜测它的作用。)

我还做了一些其他风格上的改变:

  • 四个空格,而不是两个;
  • 不要用下划线作为前缀(Rust 有足够的隐私控制,不需要使用下划线);
  • 周围没有括号if表达式(好吧,现在已被替换为match,所以没关系);
  • 如果匹配分支中只有一个语句,则不需要用大括号括起来 - 只需在其后使用逗号即可,
  • return x;可以写成x当它位于函数末尾时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

修改选择器时有没有办法在 Rust 中使用 match() ? 的相关文章

随机推荐

  • CakePHP - 删除级联不起作用

    在 CakePHP 中 我有一个模型 Type 和 SpecificType SpecificType 属于一个 Type type id 字段 当我删除SpecificType的条目时 如何才能同时删除Type 我把它作为 this gt
  • .filter() 函数返回未定义而不是过滤数组

    我正在尝试理解 javascriptArray filter方法 为什么下面的代码会返回undefined 我缺少什么 function driversWithRevenueOver driver revenue driver filter
  • 使用OpenGL绘制圆的一部分?

    我只想画一个部门 部分3d 圆的 给出 2 个角度 起点 终点 圆心坐标 半径和宽度 你能帮我做那件事吗 计算圆上点的公式 给定半径 圆心 x0 y0 和角度 以弧度为单位 float x radius cos angle x0 float
  • C++ 高效使用 new 运算符

    当用 new 实例化一个类时 如果不删除内存 我们会通过对象的重用获得哪些好处 新的流程是怎样的 是否发生上下文切换 新的内存被分配了 谁来分配 操作系统 你在这里问了几个问题 Instead of deleting the memory
  • 是否存在与 PE 基址重定位等效的 ELF?

    我一直在研究一些 ELF 二进制文件的反汇编 我注意到了这一点 0000000000401020 lt start gt 401020 31 ed xor ebp ebp 401022 49 89 d1 mov r9 rdx 401025
  • pysftp -- paramiko SSHException,来自服务器的错误主机密钥

    我正在尝试通过以下方式连接到远程主机pysftp try with pysftp Connection inventory 0 username transit private key ssh id rsa sftp port 8055 a
  • 根据数组中的元素作为索引删除数组元素

    假设我有一个数组 let arr1 0 2 This is always sorted 注意 数组中的这些元素表示要从另一个数组中删除的索引 我有另一个数组 let arrOvj 1 4 6 7 21 17 12 我想删除 arrObj 的
  • 如何使用同一台 Mac 在不同版本的 OSx 上测试和调试 Cocoa App?

    我使用 Mac 和 Yosemite 制作了一个应用程序 完成后 我将其存档 然后分发给几个朋友 其中一个拥有小牛队 我在 Mavericks 系统上遇到了一些问题 随着这件事情的发生 我心中产生了以下疑问 我可以在不同的 OSX 版本上检
  • 让 UITableViewCell 使用自动布局调整自身大小

    我有 3 个标签UITableViewCell并设置标签 以便它们自动换行 如果自动换行 文本将进入下一个单元格 如何让 AutoLayout 根据内容展开单元格 而无需在中编写代码heightForRowAtIndex方法 是否没有一个约
  • 使用 String.Format 自定义格式时间跨度

    我想将时间跨度格式化为这样的格式 49 hr 34 mn 20 sec 我使用了下面的字符串格式 String Format 0 00 1 00 2 00 theTimeSpan TotalHours theTimeSpan Minutes
  • erlang 中的数组实现

    我的问题是 与列表相反 在 Erlang 中如何实现数组 使用不可变类型做类似的事情 move X Xs Ys gt X Ys Ls move 1 2 3 2 3 4 将占用堆中的常量内存 因为这都是参考工作 但是对于数组中的相同内容 mo
  • 在 Three.js 点云中显示深度

    I have a 3D scan of a rock that I have represented as a point cloud using Three js and I wanted to more explicitly show
  • 优化 JSON 序列化器/反序列化器作为扩展方法?

    我想尽可能轻松地将任何对象序列化为 JSON 然后简单地将其转换回 type safe 对象 谁能告诉我 FromJSONString 扩展方法中我做错了什么 Edit 为了您的方便 下面是一个完整且功能齐全的扩展方法 如果您发现错误 请告
  • HttpServletRequest.getSession(false):什么时候返回null?

    我想知道什么时候调用时会出现 null HttpServletRequest getSession 假 另外 有关于 HttpSession 的好的教程吗 我想获得以下详细信息 何时 invalidate 后果是什么 我需要检查返回的 Ht
  • 为什么Python中的for循环之前不能使用分号?

    我可以在 Python 中使用分号连接行 例如 a 5 b 10 但为什么我不能对 for 做同样的事情 x a b for i j in enumerate x print i j 因为Python语法不允许这样做 看文档 stmt li
  • 分析Java中的全角或半角字符

    我想分析 char 数组中的全角或半角字符 例如 char 密码 t e s t 思 题 这个char数组中有全角和半角字符 半宽 t e s t 全角 思 题 那么 如何在java中分析char数组的全角或半角呢 多谢 东亚字符的宽度描述
  • jsp - 从 java 字符串设置输入标记 (html) 的值

    我在这里面临一个奇怪的问题 情况是这样的 我正在尝试设置一个值input来自java字符串的标签
  • 递归方法:我们如何生成括号上的所有可能性?

    我们怎样才能在大括号上生成所有可能性 N值已经给了我们 我们要产生所有的可能性 例子 1 如果 N 1 则只有一种可能性 2 如果 N 2 则可能性为 3 如果 N 3 则可能性为 注意 左括号和右括号应该匹配 我的意思是 对于 N 1 无
  • 部分成员函数模板专门化和数据成员访问

    我有一个关于模板化成员函数的部分专业化的问题 背景 目标是计算大型数据集的描述性统计数据 这些数据集太大而无法一次保存在内存中 因此 我有方差和协方差的累加器类 我可以在其中逐个推入数据集 一次一个值或更大的块 仅计算算术平均值的相当简化的
  • 修改选择器时有没有办法在 Rust 中使用 match() ?

    这个问题的名字很糟糕 但基本上 考虑这个简单的例子 您有一个以下形式的链接列表 struct Node