当前位置: 首页 > news >正文

做网站时新闻的背景图世界各国gdp排名

做网站时新闻的背景图,世界各国gdp排名,装修设计公司网站有哪些,如何做自己的网站赚钱rust学习-宏的定义与使用 声明宏(macro_rules! 宏)使用方式1. 简单的宏2. 带参数的宏3. 多个模式的宏 过程宏1. 定义过程宏1.1 属性宏1.2 函数宏1.3 派生宏 2. 使用过程宏2.1 属性宏2.2 函数宏2.3 派生宏 在 Rust 中,宏(macro&…

rust学习-宏的定义与使用

  • 声明宏(macro_rules! 宏)
  • 使用方式
    • 1. 简单的宏
    • 2. 带参数的宏
    • 3. 多个模式的宏
  • 过程宏
    • 1. 定义过程宏
      • 1.1 属性宏
      • 1.2 函数宏
      • 1.3 派生宏
    • 2. 使用过程宏
      • 2.1 属性宏
      • 2.2 函数宏
      • 2.3 派生宏

在 Rust 中,宏(macro)是一种在编译期间生成代码的机制,宏可以以更加灵活和高效的方式编写代码,Rust中有两种主要的宏:声明宏(macro_rules! 宏)和过程宏(procedural macros)

声明宏(macro_rules! 宏)

声明宏是使用 macro_rules! 关键字定义:

macro_rules! 宏名 {($($pattern:pat) => $body:expr);($($pattern:pat) => $body:expr);// 更多模式...
}

使用方式

1. 简单的宏

示例一个用于打印消息的宏:

macro_rules! say_hello {() => {println!("Hello, world!");};
}fn main() {say_hello!();
}

2. 带参数的宏

定义一个带参数的宏,用于打印带参数的消息:

macro_rules! say_hello_to {($name:expr) => {println!("Hello, {}!", $name);};
}fn main() {say_hello_to!("XiaoMing");
}

3. 多个模式的宏

定义一个宏,支持多种模式:

macro_rules! math {($x:expr, +, $y:expr) => {$x + $y};($x:expr, -, $y:expr) => {$x - $y};
}fn main() {let result1 = math!(10, +, 5);let result2 = math!(10, -, 5);println!("10 + 5 = {}", result1); // 输出: 10 + 5 = 15println!("10 - 5 = {}", result2); // 输出: 10 - 5 = 5
}

过程宏

1. 定义过程宏

过程宏需要一个特殊的 crate 类型,并且需要使用 proc_macro 库,常见的过程宏有:属性宏(attribute-like macros)、函数宏(function-like macros)和派生宏(derive macros)

1.1 属性宏

属性宏用于在代码上添加属性,通常用于生成额外的代码或修改现有的代码

use proc_macro;
use proc_macro2::TokenStream;
use quote::quote;
use syn;#[proc_macro_attribute]
pub fn my_attribute(_attr: TokenStream, item: TokenStream) -> TokenStream {let ast = syn::parse_macro_input!(item as syn::ItemFn);let ident = &ast.sig.ident;let expanded = quote! {fn #ident() {println!("Before function call");#astprintln!("After function call");}};expanded.into()
}

1.2 函数宏

函数宏类似于传统的宏,但可以在编译时生成更复杂的代码

extern crate proc_macro;use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, ItemFn};#[proc_macro]
pub fn my_function(input: TokenStream) -> TokenStream {let input = parse_macro_input!(input as ItemFn);let name = &input.sig.ident;let expanded = quote! {fn #name() {println!("This is a generated function");}};expanded.into()
}

1.3 派生宏

派生宏用于为结构体或枚举生成派生的实现

extern crate proc_macro;use proc_macro::TokenStream;
use quote::quote;
use syn::{parse_macro_input, DeriveInput};#[proc_macro_derive(MyTrait)]
pub fn my_trait_derive(input: TokenStream) -> TokenStream {let input = parse_macro_input!(input as DeriveInput);let name = &input.ident;let expanded = quote! {impl MyTrait for #name {fn my_method(&self) {println!("This is a derived method for {}", stringify!(#name));}}};expanded.into()
}

2. 使用过程宏

使用过程宏需要在 Cargo.toml 中声明依赖,并在代码中使用宏

2.1 属性宏

#[my_attribute]
fn my_function() {println!("Inside my function");
}fn main() {my_function();
}

2.2 函数宏

my_function! {fn my_generated_function() {println!("Inside generated function");}
}fn main() {my_generated_function();
}

2.3 派生宏

#[derive(MyTrait)]
struct MyStruct;trait MyTrait {fn my_method(&self);
}fn main() {let my_struct = MyStruct;my_struct.my_method();
}
http://www.yayakq.cn/news/366593/

相关文章:

  • 营销软文网站合肥网红打卡地
  • 哪些网站国内打不开健康类网站模板
  • 格力电器的网站建设评价岳阳汨罗网站建设
  • 制作h5网页流程及详细步骤番禺网站建设优化
  • 贵阳房地产网站建设asp access 做网站
  • 做传销网站自定义wordpress维护页面
  • 普法网站建设方案二维码表白网页在线生成制作
  • 网站建设制作费用预算表最新房产信息
  • 石大远程在线考试 《网页设计与网站建设》网站开发需要用哪些东西
  • 中小企业网站建设需要注意什么曲周手机网站建设
  • 企业网站教程 优帮云专业的营销网站
  • 教程网站后台密码做网站卖什么发财
  • asp.net网站开发教程下载封面型网站首页怎么做
  • 网站建设 推荐电子商务平台发展现状
  • 可视化网站开发工具跨越速运网站谁做的
  • 工信部企业网站备案浙江网站建设价格
  • 北京网站制作net2006济南市城乡建设局官网
  • 被称为网站开发神器网站建设硬件设计方案
  • 建设部网站房地产资质新浪云WordPress 主题
  • 做英语四级题的网站dedecms免费模板
  • 浙江省建设厅网站地址咖啡网站设计模板
  • 抚州市建设局招标办网站宁阳移动网站制作
  • 衡水提供网站制作公司报价服务专业的网页制作
  • opencart网站学校网站建设的意见
  • 微网站建设加盟利用access数据库做网站
  • 东莞城乡建设网站网站建设投标人资质要求
  • 做最精彩的绳艺网站网站搭建的流程
  • 政务网站平台建设 招标网站数据库转移
  • 能打开各种网站的浏览器下载自己做的网站网页滑动不
  • 天津大学生专业做网站学历提升咨询