Я анализирую вектор токенов, каждого типа enum.Это означает, что я получаю много кода вроде:
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 для объединения этих условий и битов "если позволено" в том, что чувствует себя намного более эргономичным - Отслеживание проблемы для eRFC 2497 "if- и while-let-Цепи занимают 2 " и Поддержка &&, если позволяют выражения - это позволило бы мне написать что-то вроде:
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);
}
Однако я не могу получить этоскомпилируйте в моей копии ночной Rust с edition="2018"
(точная версия 1.32.0-nightly (653da4fd0 2018-11-08)
).Так что либо у меня неправильный синтаксис, либо я неверно истолковал RFC / проблемы, и эта функция еще не реализована.В любом случае, я хотел бы получить некоторую информацию о том, как эта функция стоит.