使用闭包用字段初始化struct

时间:2017-12-13 10:55:56

标签: struct rust closures

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

这不适用于结构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 个答案:

答案 0 :(得分:3)

'没有命名字段的结构'不是完全结构而是元组结构。虽然元组结构的名称可以与函数名称一样使用,但结构名称不是这样。使用结构名称实例化一个结构,您必须指定参数的名称:

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