Как я могу изменить параметр, который был передан ходом? - PullRequest
1 голос
/ 05 июня 2019

Насколько я понимаю, если у меня есть такая функция:

fn f(x: Vec<u32>) -> (some result)

f становится владельцем x. f теперь несет ответственность за уничтожение x.

Если это так, могу ли я изменить x, и если да, то как? Чтобы получить изменяемый итератор для x, требуется &mut, которого у меня нет.

Кажется разумным, чтобы я мог изменять переменную, владельцем которой я теперь являюсь, без каких-либо вредных последствий. Я просто не уверен, как это сделать. Вызывающая функция отказалась от владения x до f, поэтому ей не важно, что с ней происходит.

Возможно, я мог бы изменить тип f на f(x: &mut Vec<u32>), но я действительно не хочу этого делать по разным причинам, например, это предотвращает естественное соединение функций типа f(g(x)), а также если мой "(некоторый результат)" отличается от Vec<u32> (например, типа, содержащего Vec<u32>), тогда мне придется разделить функцию на две части и убедиться, что вызывающая сторона делает то, что должна ,

Ответы [ 2 ]

3 голосов
/ 05 июня 2019

Вы должны объявить аргумент x изменяемым: mut x: Whatever

fn main() {
    let x = vec![];
    mutate(x);
}

fn mutate(mut x: Vec<u32>) {
    x.push(1);
}
2 голосов
/ 05 июня 2019

Вы могли бы тень x:

fn main() {
    let x = vec![];
    mutate(x);
}

fn mutate(x: Vec<u32>) {
    let mut x = x;
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...