模式匹配不允许我更改值
Pattern Matching does not allow me to change values
所以我目前正在研究一种新的编程语言tr-lang
我目前正在编写语言的解析器
这段代码就是bug所在
BlockToken::İse(bip) => {
let ise = &mut parsed[bip]; // Access method 1
match ise.typ {
TokenType::İse ( mut yoksa ) => {
yoksa = Some(ip);
},
TokenType::Yoksa ( mut tp ) => {
tp = Some(ip);
},
_ => unreachable!(),
}
ip + 1
},
BlockToken::İken(bip) => {
let iken = parsed.get_mut(bip).unwrap(); // Trying other access methods
match iken.typ {
TokenType::İken ( mut yoksa ) => {
yoksa = Some(ip + 1);
},
_ => unreachable!(),
}
bip
},
_ => unimplemented!(),
};
这是解析并生成可执行程序的代码的一部分
它给出了一些警告,但我认为问题出在这些警告上:
warning: variable `yoksa` is assigned to, but never used
--> src/parser/parser.rs:121:54
|
121 | ... TokenType::İse ( mut yoksa ) => {
| ^^^^^
|
= note: consider using `_yoksa` instead
warning: value assigned to `yoksa` is never read
--> src/parser/parser.rs:122:37
|
122 | ... yoksa = Some(ip);
| ^^^^^
|
= help: maybe it is overwritten before being read?
warning: variable `tp` is assigned to, but never used
--> src/parser/parser.rs:124:56
|
124 | ... TokenType::Yoksa ( mut tp ) => {
| ^^
|
= note: consider using `_tp` instead
warning: value assigned to `tp` is never read
--> src/parser/parser.rs:125:37
|
125 | ... tp = Some(ip);
| ^^
|
= help: maybe it is overwritten before being read?
warning: variable `yoksa` is assigned to, but never used
--> src/parser/parser.rs:134:55
|
134 | ... TokenType::İken ( mut yoksa ) => {
| ^^^^^
|
= note: consider using `_yoksa` instead
warning: value assigned to `yoksa` is never read
--> src/parser/parser.rs:135:37
|
135 | ... yoksa = Some(ip + 1);
| ^^^^^
|
= help: maybe it is overwritten before being read?
正如你所看到的,出于某种原因,即使我像往常一样进行模式匹配,当我尝试将值设置为其他值时,它也会将变量视为不同的
而不是改变 yoksa/tp 的值,最终结果不会改变任何东西
我试着改变我访问的方式 ise/iken 但是它没有改变任何东西
我也尝试使用 if let
而不是 match
它不会改变 ise.typ.yoksa 或 ise.typ.tp
的值
额外信息 BlockToken 是这个枚举
enum BlockToken {
İse(usize),
İken(usize),
İkiNoktaNokta(usize),
}
Token就是这个结构体
struct Token {
pub typ: TokenType,
pub line: usize,
pub col: usize,
}
我想要的是能够更改枚举结构 İse、İken 和 Yoksa 的内容
尽管首选安全方法,但它可能不安全
我认为你需要在匹配时匹配一个可变引用,否则你只是在创建一个局部变量并改变它。
例如这段代码:
#[derive(Debug)]
enum Blah {
A(u64),
}
mod test {
use super::Blah;
#[test]
fn test_match() {
let mut a = Blah::A(23);
println!("{:?}", a);
match a {
Blah::A(ref mut x) => *x = 5,
}
println!("{:?}", a);
}
}
将输出:
running 1 test
A(23)
A(5)
如果你 运行 它与 cargo test -- --nocapture
。
使用Option::replace
将新值放入可变选项:
yoksa.replace(ip + 1);
你可能还想要一个可变引用:
TokenType::İken(ref mut yoksa)
所以我目前正在研究一种新的编程语言tr-lang
我目前正在编写语言的解析器
这段代码就是bug所在
BlockToken::İse(bip) => {
let ise = &mut parsed[bip]; // Access method 1
match ise.typ {
TokenType::İse ( mut yoksa ) => {
yoksa = Some(ip);
},
TokenType::Yoksa ( mut tp ) => {
tp = Some(ip);
},
_ => unreachable!(),
}
ip + 1
},
BlockToken::İken(bip) => {
let iken = parsed.get_mut(bip).unwrap(); // Trying other access methods
match iken.typ {
TokenType::İken ( mut yoksa ) => {
yoksa = Some(ip + 1);
},
_ => unreachable!(),
}
bip
},
_ => unimplemented!(),
};
这是解析并生成可执行程序的代码的一部分
它给出了一些警告,但我认为问题出在这些警告上:
warning: variable `yoksa` is assigned to, but never used
--> src/parser/parser.rs:121:54
|
121 | ... TokenType::İse ( mut yoksa ) => {
| ^^^^^
|
= note: consider using `_yoksa` instead
warning: value assigned to `yoksa` is never read
--> src/parser/parser.rs:122:37
|
122 | ... yoksa = Some(ip);
| ^^^^^
|
= help: maybe it is overwritten before being read?
warning: variable `tp` is assigned to, but never used
--> src/parser/parser.rs:124:56
|
124 | ... TokenType::Yoksa ( mut tp ) => {
| ^^
|
= note: consider using `_tp` instead
warning: value assigned to `tp` is never read
--> src/parser/parser.rs:125:37
|
125 | ... tp = Some(ip);
| ^^
|
= help: maybe it is overwritten before being read?
warning: variable `yoksa` is assigned to, but never used
--> src/parser/parser.rs:134:55
|
134 | ... TokenType::İken ( mut yoksa ) => {
| ^^^^^
|
= note: consider using `_yoksa` instead
warning: value assigned to `yoksa` is never read
--> src/parser/parser.rs:135:37
|
135 | ... yoksa = Some(ip + 1);
| ^^^^^
|
= help: maybe it is overwritten before being read?
正如你所看到的,出于某种原因,即使我像往常一样进行模式匹配,当我尝试将值设置为其他值时,它也会将变量视为不同的
而不是改变 yoksa/tp 的值,最终结果不会改变任何东西
我试着改变我访问的方式 ise/iken 但是它没有改变任何东西
我也尝试使用 if let
而不是 match
它不会改变 ise.typ.yoksa 或 ise.typ.tp
的值额外信息 BlockToken 是这个枚举
enum BlockToken {
İse(usize),
İken(usize),
İkiNoktaNokta(usize),
}
Token就是这个结构体
struct Token {
pub typ: TokenType,
pub line: usize,
pub col: usize,
}
我想要的是能够更改枚举结构 İse、İken 和 Yoksa 的内容
尽管首选安全方法,但它可能不安全
我认为你需要在匹配时匹配一个可变引用,否则你只是在创建一个局部变量并改变它。
例如这段代码:
#[derive(Debug)]
enum Blah {
A(u64),
}
mod test {
use super::Blah;
#[test]
fn test_match() {
let mut a = Blah::A(23);
println!("{:?}", a);
match a {
Blah::A(ref mut x) => *x = 5,
}
println!("{:?}", a);
}
}
将输出:
running 1 test
A(23)
A(5)
如果你 运行 它与 cargo test -- --nocapture
。
使用Option::replace
将新值放入可变选项:
yoksa.replace(ip + 1);
你可能还想要一个可变引用:
TokenType::İken(ref mut yoksa)