[英]Converting Rust macro types into expressions
我想假设一个给定的类型用一个方法(例如default()
)实现一些特征(例如Default
)。 我想调用该方法并将其值存储到局部变量中。 以下是它的一般概念:
macro_rules! get_default {
( $x:ty = $alias:ident ) => {
let $alias = $x::default();
};
}
fn main() {
// get_default!(i32 = z);
// println!("get_default! {:?} ", z);
println!("i32 default {:?} ", i32::default());
}
游乐场链接 。
当我尝试时,我收到一个错误:
error: expected expression, found `i32`
--> <anon>:3:22
|>
3 |> let $alias = $x::default();
|> ^^
我理解这是因为它需要一个表达式,但我想将输入限制为仅仅类型。 有没有办法将$x
从ty
为expr
,或者是一种在类型上调用方法的方法(即使它可能缺失)。
你快到了。 您可以向编译器提示预期的默认类型,然后只使用通用函数调用语法 :
macro_rules! get_default {
( $x:ty = $alias:ident ) => {
let $alias = <$x as Default>::default();
};
}
fn main() {
get_default!(i32 = z);
println!("get_default! {:?} ", z);
println!("i32 default {:?} ", i32::default());
}
( 游乐场链接 )
关键是这个:
let $alias = <$x as Default>::default();
这会将$x
转换为Default
trait,然后根据需要调用default()
方法。
当您不需要消除特征之间的歧义时,您也可以使用速记:
let $alias = <$x>::default();
( 游乐场链接 )
使用如上所示的UFCS,您可以消除实现相同方法的特征之间的歧义。 这是' 角括号形式 ',如果default()
方法在两个特征中实现,这将非常有用。
在此特定方案中,您还可以更具体地使用UFCS,如下所示:
let $alias: $x = Default::default();
仅这一点就为Rust提供了足够的信息来推断出正确的impl
。
( 游乐场链接 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.