将枚举变体用作函数的这种奇怪语法是什么?
What is this strange syntax where an enum variant is used as a function?
下面是 syn::parse
的 mod 文档给出的 example。
enum Item {
Struct(ItemStruct),
Enum(ItemEnum),
}
struct ItemStruct {
struct_token: Token![struct],
ident: Ident,
brace_token: token::Brace,
fields: Punctuated<Field, Token![,]>,
}
impl Parse for Item {
fn parse(input: ParseStream) -> Result<Self> {
let lookahead = input.lookahead1();
if lookahead.peek(Token![struct]) {
input.parse().map(Item::Struct) // <-- here
} else if lookahead.peek(Token![enum]) {
input.parse().map(Item::Enum) // <-- and here
} else {
Err(lookahead.error())
}
}
}
input.parse().map(Item::Struct)
是有效的普通 Rust 语法(看起来不像 Item::Struct
不是函数),还是 proc_macro
库的一种特殊语法?如果是后者,是否有proc_macro
特定语法规则的文档?
此语法是标准的 Rust 语法。 您可以使用元组结构或类似元组结构的枚举变体作为函数。参见这个小示例:
enum Color {
Str(String),
Rgb(u8, u8, u8),
}
struct Foo(bool);
// Use as function pointers (type annotations not necessary)
let f: fn(String) -> Color = Color::Str;
let g: fn(u8, u8, u8) -> Color = Color::Rgb;
let h: fn(bool) -> Foo = Foo;
在下一个例子中,这些函数直接传递给另一个函数(如Option::map
)(Playground):
// A function which takes a function
fn string_fn<O, F>(f: F) -> O
where
F: FnOnce(String) -> O,
{
f("peter".to_string())
}
string_fn(|s| println!("{}", s)); // using a clojure
string_fn(std::mem::drop); // using a function pointer
// Using the enum variant as function
let _: Color = string_fn(Color::Str);
您可以在 this chapter of the book 中找到有关此功能的更多信息。
下面是 syn::parse
的 mod 文档给出的 example。
enum Item {
Struct(ItemStruct),
Enum(ItemEnum),
}
struct ItemStruct {
struct_token: Token![struct],
ident: Ident,
brace_token: token::Brace,
fields: Punctuated<Field, Token![,]>,
}
impl Parse for Item {
fn parse(input: ParseStream) -> Result<Self> {
let lookahead = input.lookahead1();
if lookahead.peek(Token![struct]) {
input.parse().map(Item::Struct) // <-- here
} else if lookahead.peek(Token![enum]) {
input.parse().map(Item::Enum) // <-- and here
} else {
Err(lookahead.error())
}
}
}
input.parse().map(Item::Struct)
是有效的普通 Rust 语法(看起来不像 Item::Struct
不是函数),还是 proc_macro
库的一种特殊语法?如果是后者,是否有proc_macro
特定语法规则的文档?
此语法是标准的 Rust 语法。 您可以使用元组结构或类似元组结构的枚举变体作为函数。参见这个小示例:
enum Color {
Str(String),
Rgb(u8, u8, u8),
}
struct Foo(bool);
// Use as function pointers (type annotations not necessary)
let f: fn(String) -> Color = Color::Str;
let g: fn(u8, u8, u8) -> Color = Color::Rgb;
let h: fn(bool) -> Foo = Foo;
在下一个例子中,这些函数直接传递给另一个函数(如Option::map
)(Playground):
// A function which takes a function
fn string_fn<O, F>(f: F) -> O
where
F: FnOnce(String) -> O,
{
f("peter".to_string())
}
string_fn(|s| println!("{}", s)); // using a clojure
string_fn(std::mem::drop); // using a function pointer
// Using the enum variant as function
let _: Color = string_fn(Color::Str);
您可以在 this chapter of the book 中找到有关此功能的更多信息。