最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析rust中的struct

 更新時間:2022年10月08日 11:55:32   作者:fan_music  
自定義的數(shù)據(jù)類型,為相關(guān)聯(lián)的值命名,打包成有意義的組合,類似python的dict,但是賦值的時候可以不按順序,本文給大家介紹下rust中的struct知識,感興趣的朋友一起看看吧

定義struct

  • 使用struct關(guān)鍵字,并為整個struct命名
  • 在花括號內(nèi),為所有字段(field)定義名稱和類型
struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

實例化struct

  • 想要使用struct,需要創(chuàng)建strut的實例
  • 為每個字段知道具體值
  • 無需按聲明的順序進(jìn)行指定
struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main(){
    let user1 = User{
        username: String::from("xxxx"),
        email: String::from("xxxx@163.com"),
        active: true,
        sign_in_count:556,
    };
    println!("username:{}", user1.username);
    println!("email:{}", user1.email);
    println!("active:{}", user1.active);
    println!("sign_in_count:{}", user1.sign_in_count);
}

取得struct里面的某個值

使用點標(biāo)記法

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main(){
    let mut user1 = User{
        username: String::from("xxxx"),
        email: String::from("xxxx@163.com"),
        active: true,
        sign_in_count:556,
    };
    // 注意 user1 必須是可變的 
    user1.username = String::from("hhhhhhh");
    println!("username:{}", user1.username);
    println!("email:{}", user1.email);
    println!("active:{}", user1.active);
    println!("sign_in_count:{}", user1.sign_in_count);
}

注意

一旦struct的實例是可變的,那么實例中的所有字段都是可以變的

struct作為函數(shù)的放回值

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn build_user(email: String, username: String)-> User{
    User{
        email: email,
        username: username,
        active: true,
        sign_in_count:1,
    }
}

fn main(){
    let email = String::from("xxxx@163.com");
    let username = String::from("llllll");
    let user1 = build_user(email, username);
    println!("username:{}", user1.username);
    println!("email:{}", user1.email);
    println!("active:{}", user1.active);
    println!("sign_in_count:{}", user1.sign_in_count);
}

字段初始化簡寫

當(dāng)字段名與字段值對應(yīng)變量名相同時,就可以使用字段初始化簡寫的方式

fn build_user(email: String, username: String)-> User{
    User{
        email,
        username,
        active: true,
        sign_in_count:1,
    }
}

struct更新語法

當(dāng)你想基于某個struct實例來創(chuàng)建一個新實例的時候,可以使用struct更新語法

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn build_user(email: String, username: String)-> User{
    User{
        email,
        username,
        active: true,
        sign_in_count:1,
    }
}

fn main(){
    let email = String::from("xxxx@163.com");
    let username = String::from("llllll");
    let user1 = build_user(email, username);
    // user2 email 重新賦值
    // user2 其他變量 使用 user1 的值
    // String 類型會被引用 從而失效
    let user2 = User{
        email: String::from("user2@163.com"),
        ..user1
    };
    // user1.username 被 user2.username 引用 從而失效
    // println!("username:{}", user1.username);
    println!("username:{}", user2.username);
    println!("email:{}", user1.email);
    println!("email:{}", user2.email);
    println!("active:{}", user1.active);
    println!("sign_in_count:{}", user1.sign_in_count);
}

tuple struct

  • 可定義類似tuple的struct,叫做tuple struct
  • tuple struct 整體有個名,但里面的元素沒有名
  • 適用:想給整個tuple起名,并且它不同于其它tuple,而且又不需要給每個元素
  • 定義tuple struct:使用struct關(guān)鍵字,后邊是名字,以及里面元素的類型
struct Color(i32, i32, i32);
struct Point(i32, i32, i32);
let black = Color(0, 2, 3);
let origin = Point(3, 2, 3);

Unit-Like Struct(沒有任何字段)

  • 可以定義沒有任何的struct,叫做Unit-Like struct(因為與{},單元類型類似)
  • 使用與需要在某個類型上失效某個trait,但是在里面有沒有想要存儲的數(shù)據(jù)結(jié)構(gòu)

struct數(shù)據(jù)的所有權(quán)

struct User{
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}
  • 這里的字段使用了String而不是&str
  • 改struct實例擁有其所有的數(shù)據(jù)
  • 只有struct實例是有效的,那么里面的字段也是有效的
  • struct里面也是存放引用,但是需要使用生命周期

什么事struct

  • std::fmt::Display
  • std::fmt::Debug
  • #[derive(Debug)]
  • {:?}
  • {:#?}
#[derive(Debug)]
struct Rectangle{
    width: u32,
    length: u32,
}
fn main(){
    let rect = Rectangle{
        width: 22,
        length: 44,
    };
    println!("{}", area(&rect));
    println!("{:?}", rect);
    println!("{:#?}", rect);
}
fn area(rect: &Rectangle)-> u32{
    rect.length * rect.width
}

struct的方法

  • 方法和函數(shù)類似:fn關(guān)鍵字、名稱、參數(shù)、返回值
  • 方法與函數(shù)不同之處
  • 方法是在struct(或enum、trait對象)的上下文中定義
  • 第一個參數(shù)是self,表示方法被調(diào)用的struct實例

定義方法

#[derive(Debug)]
struct Rectangle{
    width: u32,
    length: u32,
}
impl Rectangle{
    fn area(&self)-> u32{
        self.width * self.length
    }
}
fn main(){
    let rect = Rectangle{
        width: 33,
        length: 44,
    };
    println!("{}", rect.area());
    println!("{:#?}", rect);
}
  • 在impl塊里定義方法
  • 方法的第一個參數(shù)可以是&self,也可以獲得其所有權(quán)或可變借用。其他參數(shù)一樣。
  • 更良好的代碼組織。

??????????????方法調(diào)用的運算符

  • C/C++:object->somthing()和(*object).something()一樣
  • rust沒有->運算符
  • rust會自動引用或解引用
  • 在調(diào)用方法時就會發(fā)生這種行為
  • 在調(diào)用方法時,rust根據(jù)情況自動添加&、&mut或*,以便object可以匹配方法的簽名。
  • 下面兩行代碼效果相同
p1.distance(&p2);
(&p1).distance(&p2);

關(guān)聯(lián)函數(shù)

  • 可以在impl塊里定義不把self作為第一個參數(shù)的函數(shù),它們叫做關(guān)聯(lián)函數(shù)(不是方法)
String::from();
  • 關(guān)聯(lián)函數(shù)通常用于構(gòu)造器
  • ::符號
  • 關(guān)聯(lián)函數(shù)
  • 模塊創(chuàng)建的命名空間
#[derive(Debug)]
struct Rectangle{
    width: u32,
    length: u32,
}
impl Rectangle{
    fn square(width: u32, length: u32)->Rectangle{
        Rectangle{
            width,
            length,
        }
    }
}
fn main(){
    let rect = Rectangle::square(33, 11);
    println!("width:{}", rect.width);
    println!("length:{}", rect.length);
    println!("{:#?}", rect);
}

多個impl塊

  • 每個struct運行擁有多個impl塊

到此這篇關(guān)于解析rust中的struct的文章就介紹到這了,更多相關(guān)rust struct內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • rust類型轉(zhuǎn)換的實現(xiàn)

    rust類型轉(zhuǎn)換的實現(xiàn)

    Rust是類型安全的語言,因此在Rust中做類型轉(zhuǎn)換不是一件簡單的事,本文主要介紹了rust類型轉(zhuǎn)換的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2023-12-12
  • RUST語言函數(shù)的定義與調(diào)用方法

    RUST語言函數(shù)的定義與調(diào)用方法

    定義一個RUST函數(shù)使用fn關(guān)鍵字,下面通過本文給大家介紹RUST語言函數(shù)的定義與調(diào)用方法,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Rust中的Copy和Clone對比分析

    Rust中的Copy和Clone對比分析

    這篇文章主要介紹了Rust中的Copy和Clone及區(qū)別對比分析,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • 使用Rust語言編寫一個ChatGPT桌面應(yīng)用示例詳解

    使用Rust語言編寫一個ChatGPT桌面應(yīng)用示例詳解

    這篇文章主要介紹了如何用Rust編寫一個ChatGPT桌面應(yīng)用,文中有詳細(xì)的流程介紹,對大家的學(xué)習(xí)或工作有意一定的幫助,需要的朋友可以參考下
    2023-05-05
  • Rust生命周期之驗證引用有效性與防止懸垂引用方式

    Rust生命周期之驗證引用有效性與防止懸垂引用方式

    本文介紹了Rust中生命周期注解的應(yīng)用,包括防止懸垂引用、在函數(shù)中使用泛型生命周期、生命周期省略規(guī)則、在結(jié)構(gòu)體中使用生命周期、靜態(tài)生命周期以及如何將生命周期與泛型和特質(zhì)約束結(jié)合,通過這些機(jī)制,Rust在編譯時就能捕獲內(nèi)存安全問題
    2025-02-02
  • Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解

    這篇文章主要為大家介紹了Rust?Atomics?and?Locks內(nèi)存序Memory?Ordering詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Rust中HashMap類型的使用詳解

    Rust中HashMap類型的使用詳解

    Rust中一種常見的集合類型是哈希映射,本文主要介紹了Rust中HashMap類型的使用詳解,包含創(chuàng)建訪問修改遍歷等,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • 詳解Rust中三種循環(huán)(loop,while,for)的使用

    詳解Rust中三種循環(huán)(loop,while,for)的使用

    我們常常需要重復(fù)執(zhí)行同一段代碼,針對這種場景,Rust?提供了多種循環(huán)(loop)工具。一個循環(huán)會執(zhí)行循環(huán)體中的代碼直到結(jié)尾,并緊接著回到開頭繼續(xù)執(zhí)行。而?Rust?提供了?3?種循環(huán):loop、while?和?for,下面逐一講解
    2022-09-09
  • Rust動態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

    Rust動態(tài)調(diào)用字符串定義的Rhai函數(shù)方式

    Rust中使用Rhai動態(tài)調(diào)用字符串定義的函數(shù),通過eval_expression_with_scope實現(xiàn),但參數(shù)傳遞和函數(shù)名處理有局限性,使用FnCall功能更健壯,但更復(fù)雜,總結(jié)提供了更通用的方法,但需要處理更多錯誤情況
    2025-02-02
  • Rust調(diào)用Windows API 如何獲取正在運行的全部進(jìn)程信息

    Rust調(diào)用Windows API 如何獲取正在運行的全部進(jìn)程信息

    本文介紹了如何使用Rust調(diào)用WindowsAPI獲取正在運行的全部進(jìn)程信息,通過引入winapi依賴并添加相應(yīng)的features,可以實現(xiàn)對不同API集的調(diào)用,本文通過實例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-11-11

最新評論

乐亭县| 永清县| 渝中区| 北川| 威海市| 太保市| 曲麻莱县| 利津县| 广东省| 克东县| 清原| 安化县| 尖扎县| 宝山区| 会东县| 东光县| 明星| 万年县| 苍山县| 敖汉旗| 常熟市| 定安县| 林甸县| 彭阳县| 万全县| 巴彦淖尔市| 如东县| 横峰县| 福州市| 勃利县| 镇原县| 昌乐县| 富阳市| 景洪市| 南昌县| 武定县| 枣阳市| 突泉县| 卢氏县| 杂多县| 信宜市|