Есть ли разница между заимствованием аргумента как изменчивого и владением им и его возвратом? - PullRequest
0 голосов
/ 06 октября 2018

Рассмотрим:

fn main() {
    let mut words: Vec<String> = Vec::new();
    words.push(String::from("Example1"));
    do_something(&mut words);

    for word in words.iter() {
        println!("{}", word);
    }
}

fn do_something(words: &mut Vec<String>) {
    //modify vector, maybe push something:
    words.push(String::from("Example2"));
}

против

fn main() {
    let mut words: Vec<String> = Vec::new();
    words.push(String::from("Example1"));
    words = do_something(words);

    for word in words.iter() {
        println!("{}", word);
    }
}

fn do_something(mut words: Vec<String>) -> Vec<String> {
    //modify vector, maybe push something:
    words.push(String::from("Example2"));
    return words;
}

Оба решения будут печатать:

Example1
Example2

Есть ли разница?Что мы должны использовать?

1 Ответ

0 голосов
/ 06 октября 2018

Нет, на самом деле не так много различий в возможностях кода с использованием одного или другого.

Большинство преимуществ одного против другого лежат за пределами чистой возможности:

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

Принятие значения вместо ссылки также часто является лучшим сигналомВашему пользователю о предполагаемом использовании кода.

Существует иерархия типов взаимодействия.Если у вас есть право собственности на значение, вы можете вызвать функцию, которая приобретает право собственности, изменяемую ссылку или неизменную ссылку.Если у вас есть изменяемая ссылка, вы можете вызвать функцию, которая принимает изменяемую ссылку или неизменяемую ссылку.Если у вас есть неизменяемая ссылка, вы можете вызвать только функцию, которая принимает неизменную ссылку.Таким образом, принято принимать наиболее разрешительный тип, какой только можно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...