How do I use Option::or with references to Options?

Tim*_*mmm 0 reference optional rust

I have the following:

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

fn bar(a: &Option<Huge>, b: &Option<Huge>) {
    foo(a.or(b));
}
Run Code Online (Sandbox Code Playgroud)

Huge is some big struct that I don't want to copy or clone. This does not work because .or() takes a and b by value.

Is there an easy solution? I can probably do something like this:

foo(if a.is_some() { a } else { b });
Run Code Online (Sandbox Code Playgroud)

Surely there is a better way?

mca*_*ton 6

&Option<T>几乎从来都不是一个有用的类型,但它可以转换为Option<&T>usingas_ref

这意味着以下代码有效:

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

fn bar(a: Option<&Huge>, b: Option<&Huge>) {
    foo(a.or(b));
}
Run Code Online (Sandbox Code Playgroud)

  • @Timmmm你可能*应该*更改代码的其余部分,因为 `&amp;Option&lt;T&gt;` 严格来说不如 `Option&lt;&amp;T&gt;` 通用。但是,如果您坚持保留“foo”的签名,那么除了像问题中提到的那样编写“match”或“if”之外,您别无选择。 (4认同)