Почему Rust if-else AST использует разные типы для того и другого?
Я писал плагин Rust lint, когда обнаружил, что Rust использует разные типы для представления , а затем (Block
) и else (Expr
) частей if
в libsyntax::ast::ExprKind
и librustc::hir::Expr_
.
Мне нужно, чтобы они оба имели общие типы.
Должен ли я использовать явное совпадение над hir::Expr_::ExprBlock
, иначе часть может быть чем-то другим, и мне нужно сделать более умное сравнение?
Из источника:
// ...
pub enum Expr_ {
// ...
/// An `if` block, with an optional else block
///
/// `if expr { block } else { expr }`
ExprIf(P<Expr>, P<Block>, Option<P<Expr>>),
// ...
}
// ...
Ответы
Ответ 1
Это значит, что мы можем различать
if x {
foo();
} else if y {
bar();
}
от
if x {
foo();
} else { // note the block
if y {
bar();
}
}
Первый имеет ExprIf
в node else- Expr
, тогда как второй имеет ExprBlock
, содержащий одно выражение ExprIf
.