如何在迭代过程中转移所有权?
How to transfer ownership during iteration?
我有这个工作代码:
let foo_ips = vec![Ipv4Addr::new(127,0,0,1),
Ipv4Addr::new(127,0,0,2),
Ipv4Addr::new(127,0,0,3)];
let foos: Vec<Foo> = foo_ips.iter().map(|x| {Foo::new(*x)}).collect();
我相信这是使用复制构造函数来创建新的 Ipv4Addr
s 以传递给 Foo::new()
。
我说得对吗?
如果是这样,我如何从 foo_ips 中取出 ips
以将每个的所有权传递给 Foo::new()
?
into_iter()
,而不是 iter()
,将消耗向量。
请注意 Ipv4Addr
太小了(32 位)以至于它是 Copy
(如果我们移动而不是复制则没有任何收获)。
use std::net::Ipv4Addr;
#[derive(Debug)]
struct Foo(Ipv4Addr);
impl Foo {
fn new(addr: Ipv4Addr) -> Self {
Foo(addr)
}
}
fn main() {
println!("size of Ipv4Addr: {}", std::mem::size_of::<Ipv4Addr>());
let foo_ips = vec![
Ipv4Addr::new(127, 0, 0, 1),
Ipv4Addr::new(127, 0, 0, 2),
Ipv4Addr::new(127, 0, 0, 3),
];
let engines: Vec<Foo> = foo_ips.iter().map(|x| Foo::new(*x)).collect();
println!("engines: {:?}", engines);
println!("foo_ips: {:?}", foo_ips); // still available
let engines: Vec<Foo> =
foo_ips.into_iter().map(|x| Foo::new(x)).collect();
println!("engines: {:?}", engines);
// println!("foo_ips: {:?}", foo_ips); // consumed!
}
我有这个工作代码:
let foo_ips = vec![Ipv4Addr::new(127,0,0,1),
Ipv4Addr::new(127,0,0,2),
Ipv4Addr::new(127,0,0,3)];
let foos: Vec<Foo> = foo_ips.iter().map(|x| {Foo::new(*x)}).collect();
我相信这是使用复制构造函数来创建新的 Ipv4Addr
s 以传递给 Foo::new()
。
我说得对吗?
如果是这样,我如何从 foo_ips 中取出 ips
以将每个的所有权传递给 Foo::new()
?
into_iter()
,而不是 iter()
,将消耗向量。
请注意 Ipv4Addr
太小了(32 位)以至于它是 Copy
(如果我们移动而不是复制则没有任何收获)。
use std::net::Ipv4Addr;
#[derive(Debug)]
struct Foo(Ipv4Addr);
impl Foo {
fn new(addr: Ipv4Addr) -> Self {
Foo(addr)
}
}
fn main() {
println!("size of Ipv4Addr: {}", std::mem::size_of::<Ipv4Addr>());
let foo_ips = vec![
Ipv4Addr::new(127, 0, 0, 1),
Ipv4Addr::new(127, 0, 0, 2),
Ipv4Addr::new(127, 0, 0, 3),
];
let engines: Vec<Foo> = foo_ips.iter().map(|x| Foo::new(*x)).collect();
println!("engines: {:?}", engines);
println!("foo_ips: {:?}", foo_ips); // still available
let engines: Vec<Foo> =
foo_ips.into_iter().map(|x| Foo::new(x)).collect();
println!("engines: {:?}", engines);
// println!("foo_ips: {:?}", foo_ips); // consumed!
}