【问题标题】:Initialize struct with fields using closure使用闭包用字段初始化结构
【发布时间】:2017-12-13 10:55:55
【问题描述】:

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

这不适用于结构体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

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

【问题讨论】:

    标签: struct rust closures


    【解决方案1】:

    '没有命名字段的结构'不完全是结构,而是元组结构。虽然元组结构的名称可以与函数名称相同的方式使用,但结构名称并非如此。使用结构体名称来实例化一个结构体,你必须指定参数的名称:

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

    【讨论】:

    • 更短:wrap(1, |x| D {x})
    • 显然枚举变量具有像这样enum A&lt;T&gt; { B { x: T } }这样的命名数据需要以相同的方式初始化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2013-01-25
    • 2020-02-23
    • 1970-01-01
    相关资源
    最近更新 更多