【发布时间】:2018-11-10 02:17:55
【问题描述】:
我正在解析每个枚举类型的标记向量。这意味着我会得到很多代码,例如:
if v.len() >= 3 {
if let Token::Type1(value1) = &v[0] {
if let Token::Type2(value2) = &v[1] {
if let Token::Type(value3) = &v[2] {
return Parsed123(value1, value2, value3);
}
}
}
}
这很丑 - 我已经知道我可以这样做让它变得更好一点:
if v.len() >= 3 {
if let (Token::Type1(value1), Token::Type2(value2), Token::Type3(value3)) =
(&v[0], &v[1], &v[2])
{
return Parsed123(value1, value2, value3);
}
}
但老实说,它并没有好多少。
但是,有一些已解决的问题/RFC 以更符合人体工程学的方式链接这些条件和“如果让”位 - Tracking issue for eRFC 2497 "if- and while-let-chains take 2" 和 Support && in if let expressions - 这让我可以写如下内容:
if v.len() >= 3 &&
let Token::Type1(value1) = &v[0] &&
let Token::Type2(value2) = &v[1] &&
let Token::Type3(value3) = &v[2]
{
return Parsed123(value1, value2, value3);
}
但是,我似乎无法使用edition="2018"(确切版本为1.32.0-nightly (653da4fd0 2018-11-08))在我的夜间Rust 副本中编译它。因此,要么我的语法错误,要么我误解了 RFC / 问题,而这个功能还没有落地。无论哪种方式,我都希望了解有关此功能的一些信息。
【问题讨论】:
-
你可能会觉得this library很有趣。
-
@Michail 这个库看起来棒极了!我想知道这是否可以通过宏来实现。我认为值得自己回答并添加了一个。希望你没事。
-
if let [Token::Type1(value1), Token::Type2(value2), Token::Type3(value3), ..] = v怎么样? -
@L.F.这当然是现在的一个选择。这仅在 2020 年 3 月 12 日的 1.42.0 中稳定锈蚀。您可以在此处查看发行说明。 blog.rust-lang.org/2020/03/12/Rust-1.42.html#subslice-patterns.
-
哦,对了..是时候学习一些历史了。
标签: rust