В ржавчине допустима следующая функция:
fn unwrap<T>(s:Option<T>) -> T {
s.unwrap()
}
Она берет на себя владение s
, паникует, если это None
, и возвращает владение содержимым s
(которое является законным, поскольку Option
владеет его содержимым.)
Я пытался написать аналогичную функцию с подписью
fn unwrap_set<T>(s: BTreeSet<T>) -> T {
...
}
Идея состоит в том, что он паникует, если s
не имеет размер 1 , в этом случае он возвращает единственный элемент. Похоже, что это должно быть возможно по той же причине, по которой unwrap
возможен, однако ни один из методов в BTreeSet
не имеет правильной подписи (они должны иметь возвращаемый тип T
). Ближайшим был take
, и я попытался сделать
let mut s2 = s;
let v: &T = s2.iter().next().unwrap();
s2.take(v).unwrap()
, но это не удалось.
Возможно ли написать функцию типа unwrap_set
?