尝试从 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
.
这是有道理的。但我不知道如何只借用 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);
}
注意: 没有回答这个问题。
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);
^^^^^^^
// 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);
}
注意:
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);
^^^^^^^