问题描述
// 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
。
这是有道理的。但我不知道如何只借用 group
。 for
语法没有给我任何方法,这些也不起作用:
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);
^^^^^^^