Rust struct

Rust struct

  • 1.实例化需要初始化全部成员变量
  • 2.如果需要实例化对象可变,加上mut则所有成员变量均可变

Rust支持通过已实例化的对象,赋值给未赋值的对象的成员变量

rust 复制代码
#![allow(warnings)]
use std::io;
use std::error::Error;
use std::boxed::Box;
use std::convert::TryInto;
use std::cmp::Ordering;
use std::cmp::min;
use std::cmp::max;

struct User {
    name: String,
    age: i32
}

fn main() -> Result<(), Box<dyn Error>> {
    let u: User = User {
        name: String::from("sqs"),
        age: 12
    };
    print!("{} {} ", u.name, u.age);
    let b: User = User {
        name: String::from("sqssqs"),
        ..u
    };
    print!("{} {}", b.name, b.age);
    Ok(())
}

定义结构体中的方法

rust 复制代码
#![allow(warnings)]
use std::io;
use std::error::Error;
use std::boxed::Box;
use std::convert::TryInto;
use std::cmp::Ordering;
use std::cmp::min;
use std::cmp::max;

struct User {
    name: String,
    age: i32
}

impl User {
    fn print(&self) {
        println!("{} {}", self.name, self.age);
    }
}

fn main() -> Result<(), Box<dyn Error>> {
    let u: User = User {
        name: String::from("sqs"),
        age: 12
    };
    u.print();
    let b: User = User {
        name: String::from("sqssqs"),
        ..u
    };
    b.print();
    Ok(())
}

修改成员变量

rust 复制代码
#![allow(warnings)]
use std::io;
use std::error::Error;
use std::boxed::Box;
use std::convert::TryInto;
use std::cmp::Ordering;
use std::cmp::min;
use std::cmp::max;

struct User {
    name: String,
    age: i32
}

fn main() -> Result<(), Box<dyn Error>> {
    let mut u: User = User {
        name: String::from("sqs"),
        age: 12
    };
    print!("{} {} ", u.name, u.age);
    u.name = String::from("sqssqs");
    u.age = 16;
    print!("{} {}", u.name, u.age);
    Ok(())
}

通过 借用 修改成员变量

rust 复制代码
#![allow(warnings)]
use std::io;
use std::error::Error;
use std::boxed::Box;
use std::convert::TryInto;
use std::cmp::Ordering;
use std::cmp::min;
use std::cmp::max;

struct User {
    name: String,
    age: i32
}

fn chageAge(u : &mut User){
    u.age = 10;
}

fn main() -> Result<(), Box<dyn Error>> {
    let mut u: User = User {
        name: String::from("sqs"),
        age: 12
    };
    println!("{} {}", u.name, u.age);
    u.name = String::from("sqssqs");
    u.age = 16;
    println!("{} {}", u.name, u.age);
    chageAge(&mut u);
    println!("{} {}", u.name, u.age);
    Ok(())
}

通过 转移所有权 修改成员变量

rust 复制代码
#![allow(warnings)]
use std::io;
use std::error::Error;
use std::boxed::Box;
use std::convert::TryInto;
use std::cmp::Ordering;
use std::cmp::min;
use std::cmp::max;

struct User {
    name: String,
    age: i32
}

fn chageAge(mut u: User) -> User {
    u.age = 10;
    u
}

fn main() -> Result<(), Box<dyn Error>> {
    let mut u: User = User {
        name: String::from("sqs"),
        age: 12
    };
    println!("{} {}", u.name, u.age);
    u.name = String::from("sqssqs");
    u.age = 16;
    println!("{} {}", u.name, u.age);
    u = chageAge(u);
    println!("{} {}", u.name, u.age);
    Ok(())
}

以下代码报错

rust 复制代码
#![allow(warnings)]
use std::io;
use std::error::Error;
use std::boxed::Box;
use std::convert::TryInto;
use std::cmp::Ordering;
use std::cmp::min;
use std::cmp::max;

struct User {
    name: String,
    age: i32
}

fn chageAge(mut u: User) -> User {
    u.age = 10;
    u
}

fn main() -> Result<(), Box<dyn Error>> {   
    let mut u: User = User {
        name: String::from("sqs"),
        age: 12
    };
    println!("{} {}", u.name, u.age);
    u.name = String::from("sqssqs");
    u.age = 16;
    println!("{} {}", u.name, u.age);
    let b: User = chageAge(u);
    println!("{} {}", u.name, u.age);
    Ok(())
}

报错详情

rust 复制代码
编译出错!
error[E0382]: borrow of moved value: `u.age`
  --> /main.rs:30:31
   |
21 |     let mut u: User = User {
   |         ----- move occurs because `u` has type `User`, which does not implement the `Copy` trait
...
29 |     let b: User = chageAge(u);
   |                            - value moved here
30 |     println!("{} {}", u.name, u.age);
   |                               ^^^^^ value borrowed here after move
   |
   = note: this error originates in the macro `$crate::format_args_nl` which comes from the expansion of the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)

error: aborting due to previous error

For more information about this error, try `rustc --explain E0382`.

原因

所有权已经从u给b导致u无法使用

相关推荐
jonssonyan1 分钟前
我自建服务器部署了 Next.js 全栈项目
前端
曾曜5 分钟前
PostgreSQL逻辑复制的原理和实践
后端
A了LONE5 分钟前
h5的底部导航栏模板
java·前端·javascript
豌豆花下猫5 分钟前
Python 潮流周刊#110:JIT 编译器两年回顾,AI 智能体工具大爆发(摘要)
后端·python·ai
专注VB编程开发20年7 分钟前
各版本操作系统对.NET支持情况(250707更新)
开发语言·前端·ide·vscode·.net
Zsnoin能17 分钟前
AI + TailwindCSS快速搭建一个属于自己的TailwindCSS学习网站
前端·css
五号厂房18 分钟前
聊一聊Javascript 中 hasOwnProperty和in操作之间的区别
前端
轻语呢喃19 分钟前
JavaScript :事件循环机制的深度解析
javascript·后端
ezl1fe20 分钟前
RAG 每日一技(四):让AI读懂你的话,初探RAG的“灵魂”——Embedding
后端
经典199222 分钟前
spring boot 详解以及原理
java·spring boot·后端