【发布时间】:2017-05-26 20:28:33
【问题描述】:
我正在尝试使用正则表达式解析文件:
extern crate regex; // 1.0.1
use regex::Regex;
fn example(
section_header_pattern: Regex,
section_name: &str,
mut line: String,
mut is_in_right_section: bool,
) {
loop {
if let Some(m) = section_header_pattern
.captures(&line)
.and_then(|c| c.get(1))
{
is_in_right_section = m.as_str().eq(section_name);
line.clear();
continue;
}
}
}
fn main() {}
...但是编译器会抱怨,因为RegEx 的captures() 方法有一个在匹配的生命周期内持续存在的借用:
error[E0502]: cannot borrow `line` as mutable because it is also borrowed as immutable
--> src/main.rs:17:13
|
13 | .captures(&line)
| ---- immutable borrow occurs here
...
17 | line.clear();
| ^^^^ mutable borrow occurs here
18 | continue;
19 | }
| - immutable borrow ends here
当我到达line.clear(); 时,我已经完成了Match 并想清除缓冲区并移至文件中的下一行而不进行进一步处理。有没有好的/干净/优雅/惯用的解决方案,还是我需要硬着头皮引入后续的“if”块?
【问题讨论】:
-
与您的问题无关;你为什么使用
.eq(?我见过其他人也这样做。避免==背后的原因是什么? -
@Shepmaster 就我而言,可能对其他人也是如此,Java 的经验让我们对使用 == 进行字符串比较感到有些胆怯。在 Java 中,== 运算符比较字符串的内存偏移量/指针,而不是字节/字符的深度比较。
-
我担心它是 Java。奇怪的是,像 Java 这样的高级语言在
==上犯了这样的错误,而 Rust,一种低得多的语言,更喜欢值相等而不是引用相等。 -
@par 这可能不是争论它的最佳场所,但这听起来更像是“继承使代码难以理解”;我不确定
equals方法如何避免任何会影响==的继承异常。做正确的事情的昂贵操作总是会击败不做程序员想要的快速操作。我们还了解到,您不能只将 C 视为黄金标准。如果是这样的话,Java 将不存在,更不用说 Rust!很难说 C 具有引用相等性,因为它具有 指针的值相等性,这是不同的。
标签: rust borrow-checker