Struct 使用闭包使用字段初始化结构

Struct 使用闭包使用字段初始化结构,struct,rust,closures,Struct,Rust,Closures,通过将构造函数作为闭包参数传递给wrap函数,可以初始化元组结构a或枚举B 这不适用于名为fieldx的structD: 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(D

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

这不适用于名为field
x
的struct
D

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
}
fn包裹


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

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

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

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

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

更简短的:
wrap(1,| x | D{x})
显然是用这样的命名数据枚举变量
enum A{B{x:T}
需要以同样的方式初始化。更简短的:
wrap(1,| x | D{x})
显然是用这样的命名数据枚举变量
enum A{B{x:T}
需要以同样的方式初始化。