代码之家  ›  专栏  ›  技术社区  ›  lukwol

使用闭包初始化带有字段的结构

  •  0
  • lukwol  · 技术社区  · 8 年前

    可以初始化元组结构 A 或枚举 B 通过将构造函数作为闭包参数传递给 wrap 作用

    这不适用于struct D ,已命名字段 x :

    fn wrap<A, B, F>(item: A, f: F) -> B
    where
        F: Fn(A) -> B,
    {
        f(item)
    }
    
    #[derive(Debug)]
    struct A<T>(T);
    
    #[derive(Debug)]
    enum B<T> {
        C(T),
    }
    
    #[derive(Debug)]
    struct D<T> {
        x: T,
    }
    
    fn main() {
        println!("{:?}", wrap(1, A)); // prints A(1)
        println!("{:?}", wrap(1, B::C)); // prints C(1)
        // println!("{:?}", wrap(1, D)); // sounds good, doesn’t work
    }
    

    playground

    是否有可能以某种方式使其适用于具有命名字段的结构?

    1 回复  |  直到 8 年前
        1
  •  3
  •   Shepmaster Tim Diekmann    8 年前

    “没有命名字段的结构”不完全是结构,而是元组结构。虽然元组结构的名称可以与函数名相同的方式使用,但对于结构名来说却不是这样。使用结构名称实例化一个结构,必须指定参数的名称:

    println!("{:?}", wrap(1, |i|(D { x: i }))); // doesn't sound good, but works