日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python入坑指南_Rust入坑指南:万物初始

發布時間:2025/3/11 python 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python入坑指南_Rust入坑指南:万物初始 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有沒有同學記得我們一起挖了多少個坑?嗯…其實我自己也不記得了,今天我們再來挖一個特殊的坑,這個坑可以說是挖到根源了——元編程。

元編程是編程領域的一個重要概念,它允許程序將代碼作為數據,在運行時對代碼進行修改或替換。如果你熟悉Java,此時是不是想到了Java的反射機制?沒錯,它就是屬于元編程的一種。

反射

Rust也同樣支持反射,Rust的反射是由標準庫中的std::any::Any包支持的。

這個包中提供了以下幾個方法

TypeId是Rust中的一種類型,它被用來表示某個類型的唯一標識。type_id(&self)這個方法返回變量的TypeId。

is()方法則用來判斷某個函數的類型。

可以看一下它的源碼實現 pub fn is(&self) -> bool {

let t = TypeId::of::();

let concrete = self.type_id();

t == concrete

}

可以看到它的實現非常簡單,就是對比TypeId。

downcast_ref()和downcast_mut()是一對用于將泛型T轉換為具體類型的方法。其返回的類型是Option和Option,也就是說downcast_ref()將類型T轉換為不可變引用,而downcast_mut()將T轉換為可變引用。

最后我們通過一個例子來看一下這幾個函數的具體使用方法。use std::any::{Any, TypeId};

fn main() {

let v1 = "Jackey";

let mut a: &Any;

a = &v1;

println!("{:?}", a.type_id());

assert!(a.is::());

print_any(&v1);

let v2: u32 = 33;

print_any(&v2);

}

fn print_any(any: &Any) {

if let Some(v) = any.downcast_ref::() {

println!("u32 {:x}", v);

} else if let Some(v) = any.downcast_ref::() {

println!("str {:?}", v);

} else {

println!("else");

}

}

Rust的反射機制提供的功能比較有限,但是Rust還提供了宏來支持元編程。

到目前為止,宏對我們來說是一個既熟悉又陌生的概念,熟悉是因為我們一直在使用println!宏,陌生則是因為我們從沒有詳細介紹過它。

對于println!宏,我們直觀上的使用感受是它和函數差不多。但兩者之間還是有一定的區別的。

我們知道對于函數,它接收參數的個數是固定的,并且在函數定義時就已經固定了。而宏接收的參數個數則是不固定的。

這里我們說的宏都是類似函數的宏,此外,Rust還有一種宏是類似于屬性的宏。它有點類似于Java中的注解,通常作為一種標記寫在函數名上方。#[route(GET, "/")]

fn index() {

route在這里是用來指定接口方法的,對于這個服務來講,根路徑的GET請求都被路由到這個index函數上。這樣的宏是通過屬于過程宏,它的定義使用了#[proc_macro_attribute]注解。而函數類似的過程宏在定義時使用的注解是#[proc_macro]。

除了過程宏以外,宏的另一大分類叫做聲明宏。聲明宏是通過macro_rules!來聲明定義的宏,它比過程宏的應用要更加廣泛。我們曾經接觸過的vec!就是聲明宏的一種。它的定義如下:#[macro_export]

macro_rules! vec {

( $( $x:expr ),* ) => {

{

let mut temp_vec = Vec::new();

$(

temp_vec.push($x);

)*

temp_vec

}

};

}

下面我們來定義一個屬于自己的宏。

自定義宏需要使用derive注解。(例子來自the book)

我們先來創建一個叫做hello_macro的lib庫,只定義一個trait。pub trait HelloMacro {

fn hello_macro();

}

接著再創建一個子目錄hello_macro_derive,在hello_macro_derive/Cargo.toml文件中添加依賴[lib]

proc-macro = true

[dependencies]

syn = "0.14.4"

quote = "0.6.3"

然后就可以在hello_macro_derive/lib.rs文件中定義我們自定義宏的功能實現了。extern crate proc_macro;

use crate::proc_macro::TokenStream;

use quote::quote;

use syn;

#[proc_macro_derive(HelloMacro)]

pub fn hello_macro_derive(input: TokenStream) -> TokenStream {

// Construct a representation of Rust code as a syntax tree

// that we can manipulate

let ast = syn::parse(input).unwrap();

// Build the trait implementation

impl_hello_macro(&ast)

}

fn impl_hello_macro(ast: &syn::DeriveInput) -> TokenStream {

let name = &ast.ident;

let gen = quote! {

impl HelloMacro for #name {

fn hello_macro() {

println!("Hello, Macro! My name is {}", stringify!(#name));

}

}

};

gen.into()

}

這里使用了兩個crate:syn和quote,其中syn是把Rust代碼轉換成一種特殊的可操作的數據結構,而quote的作用則與它剛好相反。

可以看到,我們自定義宏使用的注解是#[proc_macro_derive(HelloMacro)],其中HelloMacro是宏的名稱,在使用時,我們只需要使用注解#[derive(HelloMacro)]即可。

在使用時我們應該先引入這兩個依賴hello_macro = { path = "../hello_macro" }

hello_macro_derive = { path = "../hello_macro/hello_macro_derive" }

然后再來使用use hello_macro::HelloMacro;

use hello_macro_derive::HelloMacro;

#[derive(HelloMacro)]

struct Pancakes;

fn main() {

Pancakes::hello_macro();

}

運行結果顯示,我們能夠成功在實現中捕獲到結構體的名字。

總結

我們在本文中先后介紹了Rust的兩種元編程:反射和宏。其中反射提供的功能能力較弱,但是宏提供的功能非常強大。我們所介紹的宏的相關知識其實只是皮毛,要想真正理解宏,還需要花更多的時間學習。

https://juejin.im/post/5e8f2f8b518825738e21725e

總結

以上是生活随笔為你收集整理的python入坑指南_Rust入坑指南:万物初始的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费无遮挡在线观看视频网站 | 国产91成人| 久久韩日 | 欧洲久久精品 | 亚洲一区免费电影 | 日本一区二区三区四区五区 | 久久久久久久久久久久久女国产乱 | 亚洲国产精品无码久久久 | 国产夫妻精品 | 99久久免费国产精精品 | 久久久久久国产 | 亚洲毛片在线免费观看 | 久久福利社 | 夜色综合网 | 国产人妻精品一区二区三 | 日韩视频网址 | 国产日本一区二区三区 | 天天摸天天做天天爽水多 | 国产私拍视频 | 国产高清二区 | 亚洲成人午夜影院 | 成人影院免费 | 天天干天天玩 | 麻豆精品在线观看 | 91精品人妻一区二区三区四区 | 一级成人免费 | 精品字幕 | 在线观看你懂的网站 | 亚洲日本在线观看视频 | 欧美日韩在线观看一区 | 亚洲女同一区二区 | 大胸喷奶水www视频妖精网站 | 午夜精品视频 | 亚洲h | 日韩av片在线播放 | 狠狠操精品| a级黄色片免费看 | 住在隔壁的她动漫免费观看全集下载 | 免费看国产精品 | 成人在线超碰 | 成人精品一区二区三区中文字幕 | b站大片免费直播 | 国产成人一区二区三区别 | 日本一区三区 | 一区久久久 | 高清视频免费在线观看 | 精品国产一区一区二区三亚瑟 | 久久久久久久人妻无码中文字幕爆 | av最新在线 | 日本在线视频www色 国产在线视频网址 | 亚洲国产精品网站 | 激情瑟瑟 | 西西午夜视频 | 亚洲情人网 | 搡老熟女老女人一区二区 | 中文字幕一区二区在线观看 | 一区久久久 | 性折磨bdsm欧美激情另类 | 欧美一区二区福利 | 日韩av一区二区在线观看 | 69精品丰满人妻无码视频a片 | 日产精品久久久一区二区 | 黄色av电影在线 | 手机av在线免费 | 亚洲精品久久久久久 | 色成人综合网 | 久久麻豆av| 男女日批免费视频 | 成人h动漫精品一区二区下载 | www欧美在线 | 国产在线拍揄自揄拍无码 | 成年人视频网站 | 中文字幕手机在线视频 | 日韩精品一区二区三区色欲av | 国产精品一区二区三区四 | 国产精品人人妻人人爽人人牛 | 人人澡人人透人人爽 | 中文视频在线观看 | 麻豆系列在线观看 | 久久久精品视频网站 | 久久久久国产精品国产 | a猛片| 学生调教贱奴丨vk | 亚洲一区二区天堂 | 亚州a级片| 日韩三级视频 | 春色激情站 | 亚洲天堂免费视频 | 久久刺激| 99热欧美| 国产男男gay体育生网站 | 夜夜骑日日操 | 另类激情综合 | 艳妇乳肉豪妇荡乳av | 开心黄色网 | 一本高清视频 | zjzjzjzjzj亚洲女人 | 亚洲国产aⅴ精品一区二区 日韩黄色在线视频 | 欧美精品自拍 |