gpt4 book ai didi

macros - Rust:有没有办法在宏类型参数上调用静态函数?

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

这段代码:

#![feature(macro_rules)]

macro_rules! new(
($my_type:ty) => ( $my_type::new() );
)

struct Foo {
blah: int
}

impl Foo {
fn new() -> Foo {
return Foo { blah: 0 }
}
}

fn main() {
let my_foo = new!(Foo);
println!("Foo's value: {}", my_foo.blah);
}

看起来不错,但失败并出现以下错误:

test.rs:4:25: 4:32 error: unexpected token: `Foo`
test.rs:4 ($my_type:ty) => ( $my_type::new() );
^~~~~~~

如果我进入宏并将 $my_type 替换为 Foo 它会编译并运行得很好,所以 Foo 显然是有效的位置。显然,除非 Foo 来自宏替换。

如果我运行 rustc test.rs --pretty expanded,它不会向我显示扩展的宏。它只是给了我同样的错误信息。我怀疑这意味着它在扩展宏之前生成了消息,但它可能只是除非编译成功,否则它不会向我显示任何内容。尽管这会严重限制 --pretty expanded 的用途。

根据其他实验,我基本上可以在人们期望类型起作用的所有其他地方使用宏类型参数。您只是不能对它们调用静态函数。这似乎是一个相当武断的限制,而且错误消息肯定没有帮助。

为什么存在这个限制?有解决办法吗?

最佳答案

Foo::bar()语法正在创建路径 Foo::bar然后调用该函数,并且仅适用于有效路径,不适用于任意类型,例如(u8, i8)::bar()不起作用。您可以使用 ident宏非终结符,它采用单个标识符,可以在标识符有效的任何地方使用,包括在路径内

#![feature(macro_rules)]

macro_rules! new(
($my_type: ident) => ( $my_type::new() );
)

struct Foo {
blah: int
}

impl Foo {
fn new() -> Foo {
return Foo { blah: 0 }
}
}

fn main() {
let my_foo = new!(Foo);
println!("Foo's value: {}", my_foo.blah);
}

UFCS提供通过语法 <Type>::new() 在任意类型上调用此类方法因此,当它实现时,将您当前的宏替换为

macro_rules! new(
($my_type: ty) => ( <$my_type>::new() );
)

应该也可以。

关于macros - Rust:有没有办法在宏类型参数上调用静态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26775594/

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