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无法使用

相关推荐
卷无止境3 分钟前
FastAPI Users 全面解析:概念、原理与工程实战
后端·python
程序员爱钓鱼8 分钟前
Go switch 详解
后端·面试·go
Eloudy10 分钟前
ReAct 原理简介
前端·javascript·人工智能·react.js·agent·gpu
程序员爱钓鱼11 分钟前
Rust Struct结构体详解:定义自己的复杂数据类型
后端·面试·rust
风流 少年15 分钟前
Spring AI 2.0:MCP
java·后端·spring
北斗落凡尘40 分钟前
LangGraph 入门实战(7)
后端·langchain
uzong1 小时前
业务新老系统数据迁移-负责人经验总结和复盘
后端
ZJU_统一阿萨姆1 小时前
【DSH】如何将 DeepSeek Harness 嵌入生产环境?万字解构 DeepSeek Agent Harness 的运行机制与安全边界
前端·javascript·安全
用户921080262861 小时前
4. 前端地图大量点位实时更新优化:后端推增量,前端做 diff
前端
dogstarhuang1 小时前
大模型 API 停服怎么办:用 API 网关实现多模型统一接入与可切换架构
人工智能·后端·架构·大模型·api·数字化转型·ai应用