2016-07-07 3 views

ответ

5

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 */ 
} 
+0

Или, если вы возвращаете 'Result', а также и хотят возвращать ошибки сразу, просто 'let fd = try! (libc :: creat (...));' –

Смежные вопросы