Rust 告诉“值在循环的上一次迭代中移动到这里”

2024-01-04

我正在实现一个解析器组合器库:

#[derive(Debug)]
enum Parser {
    Char(char),
    Positive(Box<Parser>),
}

impl Parser {
    fn run(self, s: &str) -> (bool, &str) {
        match self {
            Parser::Char(ch) => {
                if s[0..1].chars().next().unwrap() == ch {
                    (true, &s[1..])
                } else {
                    (false, s)
                }
            }

            Parser::Positive(parser) => {
                //println!("{:?}", parser);
                let mut s = s;
                let mut res = (false, s);
                let parser = *parser;

                loop {
                    let ret = parser.run(s);
                    if !ret.0 {
                        break;
                    }

                    res = ret;
                    s = res.1
                }

                res
            }
            _ => (false, s),
        }
    }
}

pub fn run() {
    let x = Parser::Positive(Box::new(Parser::Char('a')));
    let ret = x.run("aaa");

    println!("{} {}", ret.0, ret.1);
}

我收到错误

error[E0382]: use of moved value: `parser`
  --> src/lib.rs:25:31
   |
22 |                 let parser = *parser;
   |                     ------ move occurs because `parser` has type `Parser`, which does not implement the `Copy` trait
...
25 |                     let ret = parser.run(s);
   |                               ^^^^^^ value moved here, in previous iteration of loop

我不知道为什么会发生这种情况。我尝试添加Copy的特质Parser枚举,但这会导致其他错误。为什么我不能打电话parser.run()循环,甚至两次?一次调用即可完美编译并运行。

使用结构体而不是枚举会更好吗?


好的,将函数的签名更改为

fn run<'a>(&self, s: &'a str) -> (bool, &'a str)

现在需要修复其他一些线路。

现在可以了,但我不知道为什么。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 告诉“值在循环的上一次迭代中移动到这里” 的相关文章

  • Rust 期货中的“then”、“and_then”和“or_else”有什么区别?

    我正在学习使用 Rust future 我发现它非常令人困惑 我觉得我很蠢 但什么时候才能then and then and or else使用 预期返回什么类型 请提供一些您希望看到的不同情况的示例 TL DR then当你想做某事而不管
  • 检查 Option 是否包含特定 Some 值的最佳方法?

    您不能执行以下操作 if option is some option 1 既然如果option is some false第二次比较会出错 做这样的事情的最好方法是什么 我现在正在做什么 if option is some if optio
  • Some() 在变量赋值的左侧做什么?

    我正在阅读一些 Rust 代码 并且遇到了这一行 if let Some path env args nth 1 这个函数内部 fn main if let Some path env args nth 1 Try reading the
  • 为外国类型实现外国特征[重复]

    这个问题在这里已经有答案了 因此 我认为出于前向兼容性考虑 以防止在库中添加进一步的特征实现破坏使用类型特征的地方 有理由禁止孤立特征实现 并且它可能使编译变得更加困难 但我想知道 Rust 社区认为哪种解决方法是最理想的 以防万一这还不够
  • 如何重载“新”方法?

    我刚刚开始学习 Rust 我想知道是否有方法重载方法 首先 我创建了一个结构并使用 impl 来实现基本的 新 方法 然后我想添加带有一些参数的 新 方法 并且我尝试使用 Trait 来实现这一点 以下代码已成功编译 但是当我尝试将 new
  • 为什么这不是悬空引用?

    我正在关注第二版TRPL 书 https doc rust lang org book second edition 第二版 并且对其中一项任务有点困惑 在 的最后第10 2节 https doc rust lang org book se
  • 包含原始指针的结构可以实现 Send 并且 FFI 安全吗?

    我有一个场景 Rust 会调用 Cmalloc缓冲区并将结果指针存储到结构中 稍后 该结构将被移动到线程并传递给 C 函数 该函数会对其进行变异 我的问题的天真的方法看起来像这样 extern crate libc use libc c v
  • 使用 clap 解析用户输入字符串以进行命令行编程

    我想创建一个利用 clap 来解析输入的命令行 我能想到的最好的办法是一个循环 要求用户输入 用正则表达式将其分解并构建一个 Vec 并以某种方式传递给它 loop Print command prompt and get command
  • 将 char 解析为 u32

    正如问题所述 我如何实现这一目标 如果我有这样的代码 let a 29 for c in a chars println c as u32 我得到的是 2 和 9 的 unicode 代码点 50 57 我想要的是将这些字符解析为实际的数字
  • 与整数纹理进行 Alpha 混合以进行对象拾取

    问题描述 你好 在我们的 WebGL 应用程序中 我们正在绘制许多 甚至数十万 形状 并且我们想要发现当前鼠标位于哪个形状 我正在寻找一种有效的方法 Details 形状定义为有符号距离函数 https en wikipedia org w
  • 如何让 Visual Studio Code 重置 Rust 的 IntelliSense 引擎?

    我正在开发两个项目 一个是一个库 另一个是使用该库的程序 当我对库进行更改时 其他窗口 程序 看不到这些更改 因此我没有获得更新的 IntelliSense 关闭使用该库的程序并重新打开它确实会强制更新 但我真的不想走那么远 直接回答标题
  • 什么是 ref 可以做但引用却不能做的事情?

    什么可以ref难道参考文献不能吗 可以 match value try thing Some ref e gt do stuff e 不能同等地表达为 match value try thing Some e gt do stuff e 编
  • 如何在不使用 Box 的情况下从特征方法返回匿名类型?

    我有一个扩展特征 其方法只是适配器 组合器的简写 fn foo self gt self map i i 2 foo bar 返回类型为Trait foo 是一些嵌套的Map
  • Box、ref、&、*的理解及关系

    我对 Rust 中的指针如何工作有点困惑 有ref Box 而且我不确定他们如何一起工作 目前我的理解是这样的 Box并不是真正的指针 它是一种在堆上分配数据并在函数参数中传递未调整大小的类型 尤其是特征 的方法 ref在模式匹配中用于借用
  • '&&x' 模式匹配是否会导致 x 被复制?

    在文档中std iter 迭代器 filter https doc rust lang org stable std iter trait Iterator html method filter它解释了值通过引用传递给闭包 并且由于许多迭代
  • Rust 迭代器和 C++ 迭代器之间的主要区别是什么? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 C 迭代器的一个典型示例是指针 可用于指向 C 数组中的元素 如下所示 int array 1 2 3 4 int begin std
  • 如何在 Rust 中从文字创建格式化字符串?

    我将根据给定的参数返回一个字符串 fn hello world name Option
  • 有没有一种方法可以“展平”Rust 中的(反)序列化枚举?

    我有一个由其他枚举组成的枚举 类似于以下内容 serde为简洁起见 省略了派生和注释 enum Main A SubA B SubB enum SubA X1 X2 X3 enum SubB Y1 Y2 Y3 我很想能够使用serde反序列
  • 我可以有效地从 HashSet 中随机采样吗?

    我有一个std collections HashSet 我想采样并删除一个均匀随机的元素 目前 我正在做的是使用随机抽样索引rand gen range 然后迭代HashSet到该索引来获取元素 然后我删除选定的元素 这可行 但效率不高 有
  • Rust 中声明变量的宏?

    在 C 中 可以编写声明变量的宏 如下所示 define VARS a b c int a b c 当然 这不是您通常想要做的事情 在实际的例子中 我希望开始工作 但它并不那么简单 define VARS data stride a b c

随机推荐