尝试从 Rust 循环外借用变量绑定

问题描述

    // I want to use this...
    let group = svg::node::element::Group::new();

    for (index,character) in label_string.char_indices() {

        let character = svg::node::Text::new(character);

        let text = svg::node::element::Text::new()
        .set("x",0 + 16 * index)
        .set("y",20)
        .set("font-family","Hack")
        .set("font-size",16)
        .set("fill",color::color(foreground_color))
        .add(character);

        // ...inside this for loop.
        group.add(text);

    }

但有人告诉我use of moved value: group是因为value moved here,in prevIoUs iteration of loop

这是有道理的。但我不知道如何只借用 groupfor 语法没有给我任何方法,这些也不起作用:

    for (index,character) in label_string.char_indices() {
        ...
        let group_ref = &group;
        group_ref.add(text);
    }
    let group_ref = &group;
    for (index,character) in label_string.char_indices() {
        ...
        group_ref.add(text);
    }

注意:Trying to borrow variable binding from outside of loop 不回答这个问题。

解决方法

svg::node::element::Group::add 具有以下签名:

impl Group {
    pub fn add<T>(self,node: T) -> Self
    where
        T: Node,{ /* ... */ }
}

从这个签名中我们可以看到该方法通过值获取self(而不是通过引用,如&self&mut self),这意味着当你调用group.add(text)在循环中,将值移出 group 变量(因为 add 方法需要取得所有权)。到循环的下一次迭代时,变量中没有值,因此编译器会报错。

然而,我们也可以看到该方法返回Self,这表明我们得到了一个新值,我们可以将它重新分配给group。这样,在迭代结束(和下一次开始)时,我们将在 group 变量中拥有一个尚未移出的值:

// note that we need this to be mut now,since we're reassigning within the loop
let mut group = svg::node::element::Group::new();

for (index,character) in label_string.char_indices() {
    // ...

    // since `group.add()` takes ownership of `group`,but returns a new value,// we can just reassign to `group`,so that it is present for the next iteration
    group = group.add(text);

}
,

svg::node::element::Group::add 函数将第一个参数作为 self 并返回 Self。

代码可以固定为

let mut group = svg::node::element::Group::new();
    ^^^
//...

// in for loop
group = group.add(text);
^^^^^^^