methods - 是否可以编写将扩展为函数/方法签名的 Rust 宏?

标签 methods macros rust method-signature

我希望能够执行以下操作:

macro_rules! impl_a_method(
    ($obj:ident, $body:block) => (
        fn a_method(foo: Foo, bar: Bar, baz: Baz) -> $obj $body
    )
)

// Implementation would look like:

impl_a_method!(MyType, {
    MyType {
        foo: foo.blah(),
        bar: bar.bloo(),
        baz: baz.floozy(),
    }
})

我的真实示例以具有更大签名的方法为特色,我必须以独特的方式为 30 多种不同的类型实现这些方法。

我尝试了与上述宏类似的方法,但是我遇到了错误,其中 rustc 认为 foobarbaz 未解析的名称位于扩展站点(即使我确定宏声明在词法上先于使用)。

有没有可能做这样的事情?

如果没有,您能否推荐一种可以实现类似效果的方法?

最佳答案

由于宏观卫生,这是不可能的。宏主体中引入的任何标识符都保证与宏调用站点上的任何标识符不同。您必须自己提供所有标识符,这在某种程度上违背了宏的目的:

impl_a_method!(MyType, (foo, bar, baz), {
    MyType {
        foo: foo.blah(),
        bar: bar.bloo(),
        baz: baz.floozy(),
    }
})

这是由这个宏完成的:

macro_rules! impl_a_method(
    ($obj:ty, ($_foo:ident, $_bar:ident, $_baz:ident), $body:expr) => (
        fn a_method($_foo: Foo, $_bar: Bar, $_baz: Baz) -> $obj { $body }
    )
)

您在这里真正节省的唯一事情是编写方法参数的类型。

关于methods - 是否可以编写将扩展为函数/方法签名的 Rust 宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24905160/

相关文章:

c++ - 我可以使一个成员函数只能通过另一个类成员函数访问吗?

java - 在这种情况下如何防止方法运行两次?

macros - 函数中的 Eval 与 Clojure 中的宏

c++ - 判断函数模板中的类型

Rust 声称此模式案例无法访问,为什么?

python - 在Python中将对象方法传递给外部函数

java - 在java中实现抽象方法/类

c - C 中的内联函数与宏——开销(内存/速度)是多少?

rust - 是否有一种惯用的方法来保持对不断增长的容器元素的引用?

rust - 为什么以tokio_postgres::Transaction作为引用要求指示匿名生存期?