【问题标题】:How to transfer ownership during iteration?迭代过程中如何转移所有权?
【发布时间】:2022-01-15 21:26:35
【问题描述】:

我有这个工作代码:

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();

我相信这是使用复制构造函数来创建新的Ipv4Addrs 以传递给Foo::new()

我说的对吗?

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

【问题讨论】:

  • Ipv4AddrCopy,所以当你做 *x 时你会得到一份副本

标签: vector rust iteration ownership


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-07-20
    • 2014-10-31
    • 1970-01-01
    • 2010-11-30
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多