日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

解析rust中的struct_Rust語(yǔ)言

作者:fan_music ? 更新時(shí)間: 2022-11-20 編程語(yǔ)言

定義struct

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

實(shí)例化struct

  • 想要使用struct,需要?jiǎng)?chuàng)建strut的實(shí)例
  • 為每個(gè)字段知道具體值
  • 無(wú)需按聲明的順序進(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里面的某個(gè)值

使用點(diǎn)標(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的實(shí)例是可變的,那么實(shí)例中的所有字段都是可以變的

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);
}

字段初始化簡(jiǎn)寫

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

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

struct更新語(yǔ)法

當(dāng)你想基于某個(gè)struct實(shí)例來(lái)創(chuàng)建一個(gè)新實(shí)例的時(shí)候,可以使用struct更新語(yǔ)法

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 類型會(huì)被引用 從而失效
    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 整體有個(gè)名,但里面的元素沒(méi)有名
  • 適用:想給整個(gè)tuple起名,并且它不同于其它tuple,而且又不需要給每個(gè)元素
  • 定義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(沒(méi)有任何字段)

  • 可以定義沒(méi)有任何的struct,叫做Unit-Like struct(因?yàn)榕c{},單元類型類似)
  • 使用與需要在某個(gè)類型上失效某個(gè)trait,但是在里面有沒(méi)有想要存儲(chǔ)的數(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í)例擁有其所有的數(shù)據(jù)
  • 只有struct實(shí)例是有效的,那么里面的字段也是有效的
  • 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對(duì)象)的上下文中定義
  • 第一個(gè)參數(shù)是self,表示方法被調(diào)用的struct實(shí)例

定義方法

#[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塊里定義方法
  • 方法的第一個(gè)參數(shù)可以是&self,也可以獲得其所有權(quán)或可變借用。其他參數(shù)一樣。
  • 更良好的代碼組織。

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

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

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

  • 可以在impl塊里定義不把self作為第一個(gè)參數(shù)的函數(shù),它們叫做關(guān)聯(lián)函數(shù)(不是方法)
String::from();
  • 關(guān)聯(lián)函數(shù)通常用于構(gòu)造器
  • ::符號(hào)
  • 關(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);
}

多個(gè)impl塊

  • 每個(gè)struct運(yùn)行擁有多個(gè)impl塊

原文鏈接:https://blog.csdn.net/fan_music/article/details/127104363

欄目分類
最近更新