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
这不适用于名为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(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}
需要以同样的方式初始化。