【问题标题】:What is the difference between macros and functions in Rust?Rust 中的宏和函数有什么区别?
【发布时间】:2015-04-25 23:40:05
【问题描述】:

引用自Rust blog

最后要提一点:Rust 的宏与 C 宏有很大的不同,如果你用过的话

Rust 中的宏和函数有什么区别?它与 C 有何不同?

【问题讨论】:

    标签: rust


    【解决方案1】:

    继续阅读文档,特别是 the chapter on macros!

    Rust 函数与 Rust 宏

    宏在编译时执行。它们通常会扩展为编译器需要进一步处理的新代码。

    Rust 宏与 C 宏

    对我来说最大的不同是Rust macros are hygenic。这本书有一个例子解释了卫生会阻止什么,并且还说:

    每个宏扩展都发生在不同的“语法上下文”中,每个变量都用引入它的语法上下文进行标记。

    它使用这个例子:

    例如,这个 C 程序打印 13 而不是预期的 25。

    #define FIVE_TIMES(x) 5 * x
    
    int main() {
        printf("%d\n", FIVE_TIMES(2 + 3));
        return 0;
    }
    

    除此之外,Rust 宏

    • 可以与编译后的代码一起分发
    • 可以在参数计数中重载
    • 可以匹配大括号、圆括号或逗号等语法模式
    • 可能需要重复输入模式
    • 可以递归
    • 在语法级别而不是文本级别操作

    【讨论】:

    • 这个答案缺少一件事来回答“宏和函数有什么区别?”是“为什么我们需要函数?”,因为答案似乎将宏描述为具有函数的所有特性等等。
    • 我不明白为什么是5 * 2 + 3 而不是5 * 5。值得一提的是,因为大多数人可能不会阅读FIVE_TIMES(x)x 作为2 + 3 操作的链接,不是2+3 = 5 的结果。插入 2 + 3,然后你得到5 * 2 + 3,操作顺序给你5*2 = 10,然后是10 + 3 = 13。因此,如果您从字符串的角度考虑,这只是一个未评估的替换。
    【解决方案2】:

    引用the Rust documentation:

    宏和函数的区别

    从根本上说,宏是一种编写代码的方式,它可以编写其他代码,它 被称为元编程。在附录 C 中,我们讨论了derive 属性,它为您生成各种特征的实现。我们已经 在整本书中还使用了println!vec! 宏。所有这些 宏扩展以生成比您手动编写的代码更多的代码。

    元编程对于减少您必须编写的代码量和 维护,这也是函数的作用之一。但是,宏有 一些函数没有的额外权力。

    函数签名必须声明参数的数量和类型 功能有。另一方面,宏可以采用可变数量的 参数:我们可以用一个参数调用println!("hello"),或者 println!("hello {}", name) 有两个参数。此外,宏被扩展 在编译器解释代码的含义之前,一个宏可以,对于 例如,在给定类型上实现特征。一个函数不能,因为它得到 在运行时调用,并且需要在编译时实现 trait。

    实现宏而不是函数的缺点是宏 定义比函数定义更复杂,因为您正在编写 编写 Rust 代码的 Rust 代码。由于这种间接性,宏定义是 通常比功能更难阅读、理解和维护 定义。

    宏和函数之间的另一个重要区别是您必须 定义宏或将它们带入范围之前您在文件中调用它们,如 与您可以在任何地方定义并在任何地方调用的函数相反。

    【讨论】:

      【解决方案3】:

      macro中,可以取可变数量的参数。

      function 中,您必须定义参数的数量和类型。

      【讨论】:

      • 请澄清这个答案对现有答案的添加,其中提到 可以在参数计数中重载
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 2019-09-10
      • 2022-01-23
      相关资源
      最近更新 更多