Клонирование из Vec of Ref Подсчет раз в vec объекта - PullRequest
0 голосов
/ 18 октября 2018

У меня в настоящее время есть Vec<Rc<Item>>, и я бы очень хотел иметь Vec<Item>, в котором каждый Rc-элемент клонируется в новый Vec.Как мне это сделать?

Ответы [ 2 ]

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

Для этого вы можете использовать обычный шаблон iter().map(...).collect().Внутри карты вам нужно создать клон элемента внутри Rc, сначала разыменовав, а затем вызвав clone():

let v: Vec<_> = (0..10).map(|_| Rc::new(String::from("a"))).collect();
let v: Vec<_> = v.iter().map(|s| (**s).clone()).collect();

Тип s в замыкании: &Rc<String>,Разыменовав один раз, вы получите Rc<String>.Разыменовывая снова, вы получаете String.Строка неявно перезагружается для вызова clone(), который возвращает копию строки.

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

Если вы хотите избежать клонирования чего-либо, и у вас есть только одна ссылка на каждое значение в массиве, тогда вы можете просто развернуть Rc s:

use std::rc::Rc;

fn main() {
    let strs = vec![Rc::new("aghaj".to_string()); 7];

    println!("{:?}", strs);

    let unwrapped: Vec<_> = strs
        .into_iter()
        .map(|x| Rc::try_unwrap(x).unwrap())
        .collect();

    println!("{:?}", unwrapped);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...