宏:代码效率的隐藏力
#编程 #python #go #rust

在编程中,简单性和效率通常是主要目标。宏的功能与订购餐厅的订购相似的功能,以快速有效地表达您对用餐的偏爱。宏的使用(一种代码速记)允许程序员构建可重复使用的代码部分,而无需编写相同的代码。宏的宇宙,复杂的用例以及它们在编程中至关重要的原因 - 尤其是在像rust这样的语言中。

宏:他们是什么?

让我们假设您是一个了不起的家庭厨师(我们俩都不知道您不是),并且您有一种喜欢创造的菜,例如,您可以创建经典的意大利胡言乱语。该食谱具有新鲜的草药,柔软的牛肉和富含咸味的酱汁的理想平衡,具有独特的旋转,并在新鲜煮熟的意大利面上供应。

但偶尔,您会在自己喜欢的餐厅里享用午餐。每次您访问时,您总是会订购他们提供的意大利面条肉酱。这并不像您在家中制作的那种,但它仍然以其自己的特殊方式美味。您简单地说,我有通常的,而不是给服务员提供所有成分的列表。

在这里,通常与编程宏相媲美。您一次定义并反复使用的一组指令称为宏。编程中的宏指示计算机执行一组特定的职责,而无需您每次单独指定每个步骤,就像对服务员说“通常”通知他,而无需列出每个组件。


println!("I don't know how to cook")

在Rust中,我们使用println!()宏在屏幕上打印物品,类似于服务员如何写下您的订单以记住它。这类似于烹饪您喜欢的菜:一旦知道食谱,就可以轻松地复制它。

生锈宏的力量

以其效率和安全性而闻名,Rust是一种静态打字的编译语言。它还具有强大的宏观系统,这是众所周知的。生锈中的宏与功能相似,但是由于它们可以接受广泛的输入并在编译时执行,因此它们更有效。在Rust中,宏有两种口味:用macro_rules!和程序宏创建的声明宏,它们更复杂,可以定义功能,生成性状或实现自定义特征。

macro_rules! say_hello {
    ($name:expr) => {
        println!("Hello, {}!", $name);
    };
}

fn main() {
    say_hello!("Alice");
    say_hello!("Bob");
}

say_hello!是我们的自定义宏。当我们说say_hello!(“爱丽丝”)时,就像说“通常的爱丽丝”,该程序将打印“你好,爱丽丝!”。

充分利用宏

宏不仅仅是避免代码重复的简单工具。这是宏的一些更高级用途。

条件汇编:

选择包含哪个代码以及在编译期间要省略的代码时,宏可能很有用。当构建需要在开发和生产环境或支持多个硬件或软件平台的代码上行动不同时,此功能至关重要。

#[cfg(target_os = "windows")]
macro_rules! target_platform {
    () => {
        "Windows"
    };
}

#[cfg(target_os = "linux")]
macro_rules! target_platform {
    () => {
        "Linux"
    };
}

fn main() {
    println!("Running on {} platform.", target_platform!());
}

您知道某些玩具的行为如何不同,具体取决于您是内部还是外部?也许您有一个机器人,只能在光滑的厨房地板上移动,而只能在户外的沙盒中运行的玩具车。每个玩具都有一个独特的位置。

类似于这些小工具的代码。类似于您的玩具根据其所在的位置的行为不同,该程序的行为略有不同。

这是如何工作的:

  • 首先,它问,我在窗户上跑步吗?如果答案是的,则选择玩具车说:
  • 如果它不在窗户上运行,它问:我在Linux上跑步吗?如果答案是的,则选择机器人说:

variadic输入:

宏可以接受可变数量的参数,当您事先知道一个函数可能需要多少输入时,这可能非常方便。

macro_rules! create_array {
    ($($element:expr),*) => {
        [$($element),*]
    };
}

fn main() {
    let arr = create_array!(1, 2, 3, 4, 5);
    println!("{:?}", arr);
}

控制流结构:

宏还可以创建自定义控制流结构,这些结构与内置的if,for,while等。例如,我们可以创建一个重复!重复操作的宏一数次。

macro_rules! repeat {
    ($count:expr, $action:expr) => {
        for _ in 0..$count {
            $action;
        }
    };
}

fn main() {
    repeat!(5, println!("I love macros!"));
}

代码生成:

您可以使用宏来生成代码,例如创建新功能或为类型实现特质。

macro_rules! impl_add_trait_for {
    ($t:ty) => {
        impl std::ops::Add for $t {
            type Output = Self;
            fn add(self, other: Self) -> Self {
                self + other
            }
        }
    };
}

impl_add_trait_for!(i32);
impl_add_trait_for!(f64);

编程宏是有效的工具,可以使您的代码更简单,消除重复并提高灵活性。它们创造了一种快速简便的方法来获得您需要做的工作,就像在您最喜欢的餐厅订购平常一样。锈的例子只是刮擦宏的表面。

像Rust这样的语言特别利用了宏的潜力,允许两种陈述性宏和程序上的宏观。

学习宏的能力,即在保持高度的代码功能和控制权的同时,弥合了代码的冗长和简洁之间的差距,最终在现代编程工具箱中是至关重要的人才。 Macros仍然是针对平台特定的杂务和代码效率优化的首选解决方案,使其成为您想在编程职业中使用的神奇快捷方式。