No, это невозможно по дизайну. let
переплеты one of the two non-expression statements в ржавчине. Это означает, что привязка не возвращает никакой ценности, которую можно было бы использовать дальше.
Привязки как выражения не имеют большого смысла в ржавчине в целом. Рассмотрим let s = String::new()
: это выражение не может вернуть String
, потому что s
владеет строкой. Или как насчет let (x, _) = get_tuple()
? Выражает ли выражение весь кортеж или просто не проигнорированные элементы? Поэтому ⇒ let
привязки не являются выражениями.
Об if let
: К сожалению, это тоже не сработает. Это просто позволяет нам проверить, работает ли деструктурирование, иначе говоря: разрушить опровержимый шаблон. Это не только работает с Option<T>
, но и со всеми типами.
Если вы действительно хотите, чтобы сократить этот код, есть способ: сделать c_int
легко конвертируемой в более идиоматический тип, как Result
. Лучше всего это сделать с помощью расширения черты:
trait LibcIntExt {
fn to_res(self) -> Result<u32, u32>;
}
impl LibcIntExt for c_int {
fn to_res(self) -> Result<u32, u32> {
if self < 0 {
Err(-self as u32)
} else {
Ok(self as u32)
}
}
}
При этом вы можете использовать if let
в результате Result
:
if let Err(fd) = libc::creat(path, FILE_MODE).to_res() {
/* error */
}
Или, если вы возвращаете 'Result', а также и хотят возвращать ошибки сразу, просто 'let fd = try! (libc :: creat (...));' –