我正在尝试使用正则表达式解析一个文件:
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()
?我看到其他人也这样做。避免使用==
的理由是什么?回答:.eq()
和==
都可以用于比较两个值是否相等,但它们在处理某些特殊情况时可能会有所不同。例如,.eq()
可以用于比较NaN(非数字)和undefined(未定义)值,而==
不能。因此,在某些情况下,为了确保正确的比较结果,使用.eq()
可能更可靠。 - Shepmaster==
方面出现了失误,而Rust这种更低级的语言则偏爱值相等而不是引用相等。 - Shepmasterequals
方法如何免于任何会影响==
的继承奇怪现象。昂贵的操作总是会击败那些不能做到程序员想要的快速操作。我们还学到了你不能仅仅把C指定为黄金标准。如果是这样的话,Java就不存在了,更不用说Rust了!说C具有引用相等性很棘手,因为它具有指针值相等性,这是不同的。 - Shepmaster