gpt4 book ai didi

vector - 迭代过程中如何转移所有权?

转载 作者:行者123 更新时间:2023-12-03 08:13:03 29 4
gpt4 key购买 nike

我有这个工作代码:

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 并传递给 Foo::new()

我说得对吗?

如果是这样,我如何从 foo_ips 中取出 ips 将每个的所有权传递给 Foo::new()

最佳答案

into_iter(),而不是 iter(),将消耗向量。

请注意,Ipv4Addr 非常小(32 位),因此它是复制(如果我们移动而不是复制,则不会获得任何结果)。

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!
}

关于vector - 迭代过程中如何转移所有权?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70317174/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com