- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我面临着生命周期的问题。实现应平衡三种括号:(
、[
和 {
。我正在为其使用堆栈,但遇到了一些问题.
pub struct Brackets {
stack: Vec<char>,
}
impl<'a> From<&'a str> for Brackets {
fn from(input: &str) -> Self {
let mut stack: Vec<char> = Vec::new();
for c in input.chars() {
stack.push(c);
}
Brackets { stack }
}
}
impl<'a> Brackets {
pub fn are_balanced(&self) -> bool {
let mut stack = Vec::new();
for c in &self.stack {
// Converts the character to a String to a &str... Feels dumb
let slice = &c.to_string()[..];
match slice {
"(" | "[" | "{" => stack.push(slice),
")" | "]" | "}" => {
let popped = stack.pop();
match popped {
Some(")") => {
if slice != "(" {
return false;
};
}
Some("]") => {
if slice != "[" {
return false;
};
}
Some("}") => {
if slice != "{" {
return false;
};
}
_ => return false,
}
}
_ => continue,
}
}
true
}
}
我想压入一个左括号,然后弹出一个右括号。如果右括号与左括号不匹配,则括号不平衡。我忽略任何非括号输入。
我遇到的问题:
error[E0597]: borrowed value does not live long enough
--> src/main.rs:21:26
|
21 | let slice = &c.to_string()[..];
| ^^^^^^^^^^^^^ temporary value does not live long enough
...
47 | }
| - temporary value dropped here while still borrowed
...
50 | }
| - temporary value needs to live until here
我知道 are_balanced(&self)
函数中的堆栈比我插入堆栈的 slice
变量的生命周期更长。我该如何解决这个问题?我已经尝试将堆栈的类型更改为 &'a str
并将生命周期放在 Brackets
结构上,但没有成功。一个猜测是它可以通过在任何地方使用拥有的 String
来解决,但它似乎不必要地昂贵,我真的很想看到一个解决方案..
最佳答案
您似乎混淆了字符串文字 "("
和 char
文字 '('
。如果您替换所有字符串文字,您的代码工作:
for &c in &self.stack {
match c {
'(' | '[' | '{' => stack.push(c),
')' | ']' | '}' => {
let popped = stack.pop();
match popped {
Some(')') => {
if c != '(' {
return false;
};
}
Some(']') => {
if c != '[' {
return false;
};
}
Some('}') => {
if c != '{' {
return false;
};
}
_ => return false,
}
}
_ => continue,
}
}
Rust 与 Python 或 Bash 不同,char
和字符串有不同的类型。虽然它有点误导,因为它并不真正代表一个字符,而是一个 Unicode 标量值。一些你认为是字符的东西实际上不能用 char
表示(例如,很多表情符号,或一些重音字母,如 ɔ̃
)。这意味着对于某些应用程序,您可能要三思而后行,是使用 char
还是使用字符串。然而,为了平衡括号,使用 char
是完全没问题的;我不希望花哨的 Unicode 括号没有自己的标量值。
请注意,我还更改了循环以使用 &c
,这是因为迭代堆栈会产生对其元素的引用(因此在我们的示例中为 &char
),但在这种情况下有点不方便。使用 &c
确保 c
本身是一个 char
(&c: &char
<=> c:字符
).
至于后续问题
say we have a stack with string slices, how can one deal with the lifetime issues
嗯,这完全取决于为什么需要保存字符串(我们已经看到没有必要)。
由于问题来自尝试存储对临时字符串的引用(代码中的 c.to_string()
),您可以存储拥有的 String
(无论如何你已经分配了它们)。
关于rust - 平衡支架时的生命周期问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51864616/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!