Rust struct

Rust struct

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

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

定义结构体中的方法

#![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(())
}

修改成员变量

#![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(())
}

通过 借用 修改成员变量

#![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(())
}

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

#![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(())
}

以下代码报错

#![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(())
}

报错详情

编译出错!
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无法使用

相关推荐

最近更新

  1. TCP协议是安全的吗?

    2024-06-06 16:04:36       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-06 16:04:36       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-06 16:04:36       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-06 16:04:36       20 阅读

热门阅读

  1. MATLAB基础应用精讲-【数模应用】聚类分析

    2024-06-06 16:04:36       11 阅读
  2. Python中的cos函数:深入解析与应用

    2024-06-06 16:04:36       13 阅读
  3. 关于跨平台UI开发的几个问题确认

    2024-06-06 16:04:36       8 阅读
  4. ResourceManager 的 rpc server 模型

    2024-06-06 16:04:36       8 阅读
  5. 【SAP HANA 34】HANA查找函数LOCATE的使用

    2024-06-06 16:04:36       10 阅读
  6. Mybatis学习之Spring boot整合Mybatis示例

    2024-06-06 16:04:36       9 阅读