Как использовать Option :: или со ссылками на Options? - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть следующее:

fn foo(f: &Option<Huge>) {}

fn bar(a: &Option<Huge>, b: &Option<Huge>) {
    foo(a.or(b));
}

Huge - это большая структура, которую я не хочу копировать или клонировать. Это не работает, потому что .or() принимает a и b по значению.

Есть ли простое решение? Я, вероятно, могу сделать что-то вроде этого:

foo(if a.is_some() { a } else { b });

Конечно, есть лучший способ?

1 Ответ

6 голосов
/ 01 апреля 2020

&Option<T> почти никогда не является полезным типом, но его можно преобразовать в Option<&T>, используя as_ref.

Это означает, что работает следующий код:

fn foo(f: Option<&Huge>) {}

fn bar(a: Option<&Huge>, b: Option<&Huge>) {
    foo(a.or(b));
}
...