В качестве упрощенного самодостаточного примера предположим, что я анализирую входной файл, полный определений форм:
// shapes.txt
Circle: radius 1, color blue
Square: edge 5, color red
Triangle: edge 2 , color black
Triangle: edge 2 , color white
Я хочу разобрать их на такие структуры, как:
struct Circle {
radius: i32,
color: String
}
struct Square {
edge: i32,
color: String
}
struct Triangle {
edge: i32,
color: String
}
Я хотел бы разобрать их на набор векторов, зависящих от формы, например:
CircleDb: Vec<Circle>;
TriangleDb: Vec<Triangle>;
SquareDb: Vec<Square>;
... используя блок совпадений, например:
match inputFile.nextWord() {
"Circle" => {
Circle c = parseCircle(inputFile);
CircleDb.push(c);
},
"Square" => {
Square s = parseSquare(inputFile);
SquareDb.push(s);
},
"Triangle" => {
Triangle t = parseTriangle(inputFile);
TriangleDb.push(t);
},
}
А теперь представьте, что вместо 3-х форм у меня есть 10 или 15. Поэтому я не хочу повторять одну и ту же последовательность x=parseX(inputFile); XDb.push(x);
в каждой ветви. Я лучше скажу что-то вроде:
let myMatcher = match inputFile.nextWord() {
"Circle" => CircleMatcher,
"Square" => SquareMatcher,
"Triangle" => TriangleMatcher,
};
myMatcher.store(myMatcher.parse(inputFile));
Но я не могу придумать какого-либо последовательного способа определить Matcher
структуру / тип / черту / что угодно, не нарушая ограничений средства проверки типов. Можно ли делать такие динамические вещи? Это хорошая идея? Я хотел бы получить представление о некоторых хороших шаблонах здесь.
Спасибо!