gpt4 book ai didi

macros - 将 Rust 宏类型转换为表达式

转载 作者:行者123 更新时间:2023-11-29 07:45:30 25 4
gpt4 key购买 nike

我想假设一个给定的类型通过一个方法(例如 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());
}

Playground link .

当我尝试时出现错误:

error: expected expression, found `i32`
--> <anon>:3:22
|>
3 |> let $alias = $x::default();
|> ^^

我知道这是因为它需要一个表达式,但我只想将输入限制为类型。有没有一种方法可以将 $xty 转换为 expr,或者可以调用一种类型的方法(即使它可能缺失).

最佳答案

你快到了。您可以向编译器提示预期的默认类型,然后只需使用 universal function call syntax :

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());
}

( Playground link )

关键是:

let $alias = <$x as Default>::default();

这会将 $x 转换为 Default 特征,然后根据需要调用 default() 方法。

当你不需要消除特征之间的歧义时,你也可以使用速记:

let $alias = <$x>::default();

( Playground link )

UFCS 的更一般用法

如上所示使用 UFCS,您可以消除实现相同方法的特征之间的歧义。这是'angle-bracket form ' 如果 default() 方法在两个特征中实现,这将很有用。

在这种特定场景下,你还可以更具体地使用 UFCS,像这样:

let $alias: $x = Default::default();

仅此一项就为 Rust 提供了足够的信息来推断正确的 impl

( Playground link )

关于macros - 将 Rust 宏类型转换为表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39453625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com