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

Trying to borrow variable binding from outside of loop in 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);
    }

注意: 没有回答这个问题。

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 方法需要取得所有权)。到下一次循环迭代时,变量中没有值,所以编译器会报错。

但是,我们也可以看到方法returns 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 和 return Self.

代码可以固定为

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

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