当我发现Rust使用不同类型来表示然后(Block
)和 else (Expr
时,我正在编写Rust lint插件)if
和libsyntax::ast::ExprKind
中librustc::hir::Expr_
语句的部分内容。
我需要他们两个都有共同的类型。
我应该只使用hir::Expr_::ExprBlock
上的明确匹配,否则部分可能是其他内容,我需要进行更智能的比较?
来自the source:
// ...
pub enum Expr_ {
// ...
/// An `if` block, with an optional else block
///
/// `if expr { block } else { expr }`
ExprIf(P<Expr>, P<Block>, Option<P<Expr>>),
// ...
}
// ...
答案 0 :(得分:7)
这是我们可以区分的
if x {
foo();
} else if y {
bar();
}
这
if x {
foo();
} else { // note the block
if y {
bar();
}
}
第一个在其他节点中有一个ExprIf
- Expr
而第二个有一个ExprBlock
包含一个ExprIf
- 表达式。