Где я должен использовать & v: & V для описания параметра в сигнатурах функций? - PullRequest
0 голосов
/ 17 июня 2019

Вы можете найти следующий код на Rust Playground .

fn main() {
    #[derive(Clone, Copy, Debug)]
    struct Foo {
        bar: u32,
    }

    fn take_ref(&f: &Foo) {
        println!("{:?}", f);
    }

    fn take_foo(f: Foo) {
        println!("{:?}", f);
    }

    let f = Foo {
        bar: 1,
    };

    take_ref(&f);
    println!("{:?}", f);

    take_foo(f.clone());
    println!("{:?}", f);
}

Являются ли эти функции, take_ref и take_foo одинаковыми?Когда мне следует использовать & v: & V вместо v: V?

1 Ответ

0 голосов
/ 18 июня 2019

В общем, я думаю, что вы никогда не должны использовать форму &f: &Foo. Единственная причина, по которой он принимается компилятором, заключается в том, что параметры функции (например, let присваивание) на самом деле являются неопровержимыми образцами. Это можно увидеть в сообщении об ошибке, если вы попытаетесь ввести общий шаблон:

fn take_option (Some (f): Option<Foo>) {
    println!("{:?}", f);
}

не жалуется на неверный синтаксис, а вместо этого выдает следующее сообщение об ошибке:

error[E0005]: refutable pattern in function argument: `None` not covered
  --> src/main.rs:15:21
   |
15 |     fn take_option (Some (f): Option<Foo>) {
   |                     ^^^^^^^^ pattern `None` not covered

Использование шаблонов в качестве аргументов функций допускает такие полезные вещи, как автоматическая кортеж, массив или деструктуризация структуры:

fn take_tuple ((x, y): (i32, i32)) {
    println!("x: {}, y: {}", x, y);
}

fn take_array ([x, y]: [i32; 2]) {
    println!("x: {}, y: {}", x, y);
}

fn take_foo (Foo { bar: bar }: Foo) {
    println!("bar: {}", bar);
}

population
   .iter()
   .enumerate()
   .map (|(rank, person)| { ... });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...