在回答这个问题之后,我现在面临嵌套组的问题。于是就有了这个问题。
在下面的代码中(这里是Rust Playground)第三个
assert
不起作用,为什么?
另外,我需要在每组之前区分
AND
、OR
和 NOT
。
我正在努力了解要使用什么数据结构。你能帮我吗?
enum Token {
Str(&'static str),
Value(&'static str),
StartGroup(&'static str),
EndGroup,
}
fn main() {
let data: Vec<Vec<Token>> = vec![
vec![Token::Str("A = "), Token::Value("1")],
vec![Token::StartGroup(" OR ")],
vec![Token::Str("B = "), Token::Value("2")],
vec![Token::Str("C = "), Token::Value("3")],
vec![Token::Str("D = "), Token::Value("4")],
vec![Token::EndGroup],
];
assert_eq!(
"A = 1 AND (B = 2 OR C = 3 OR D = 4)",
construct_string(data)
);
let nested_data: Vec<Vec<Token>> = vec![
vec![Token::Str("A = "), Token::Value("1")],
vec![Token::StartGroup(" OR ")],
vec![Token::Str("E = "), Token::Value("5")],
vec![Token::Str("F = "), Token::Value("6")],
vec![Token::Str("G = "), Token::Value("7")],
vec![Token::EndGroup],
vec![Token::StartGroup(" AND ")],
vec![Token::Str("M = "), Token::Value("8")],
vec![Token::Str("N = "), Token::Value("9")],
vec![Token::Str("O = "), Token::Value("10")],
vec![Token::StartGroup(" OR ")],
vec![Token::Str("B = "), Token::Value("2")],
vec![Token::Str("C = "), Token::Value("3")],
vec![Token::EndGroup],
vec![Token::EndGroup],
];
assert_eq!(
"A = 1 AND (E = 5 OR F = 6 OR G = 7) AND (M = 8 AND N = 9 AND O = 10 AND (B = 2 OR C = 3))",
construct_string(nested_data)
);
let different_nested_data: Vec<Vec<Token>> = vec![
vec![Token::Str("A = "), Token::Value("1")],
vec![Token::StartGroup(" OR ")],
vec![Token::StartGroup(" OR ")],
vec![Token::Str("B = "), Token::Value("2")],
vec![Token::Str("C = "), Token::Value("3")],
vec![Token::EndGroup],
vec![Token::Str("E = "), Token::Value("5")],
vec![Token::Str("F = "), Token::Value("6")],
vec![Token::Str("G = "), Token::Value("7")],
vec![Token::EndGroup],
];
assert_eq!(
"A = 1 AND ((B = 2 OR C = 3) OR E = 5 OR F = 6 OR G = 7)",
construct_string(different_nested_data)
);
}
fn construct_string(tokens: Vec<Vec<Token>>) -> String {
let mut result = String::new();
let mut next = String::new();
let mut new_group = true;
for token in tokens {
for part in token {
match part {
Token::Str(str) => {
if !new_group {
result.push_str(&next);
}
new_group = false;
result.push_str(str);
}
Token::Value(val) => {
result.push_str(val);
}
Token::StartGroup(group) => {
if !new_group {
result.push_str(" AND "); // this is wrong, it possibly can also be OR or NOT
}
result.push_str("(");
new_group = true;
next = group.to_string();
}
Token::EndGroup => {
result.push_str(")");
next = String::new();
}
}
}
}
result
}