rust学习_结构体

结构体的定义的三种方式

1.普通/常规结构体 

struct StructName {
      field1: Type1
      field2: Type2
}

2.
元组结构体 (元组:可以包含多个不同类型元组的集合)
  1.字段只有
类型,没有名称
  2.因为有些地方用结构体的时候不需要名称 
  3.如何定义
     struct StructName(i32, i32, i32)

3.单元结构体
  1.单元结构体没有字段,类似于空元组(())
  2.单元结构体用于实现某些trait 或作为标记
  struct AlwaysEqual;
  fn main() {
      let subject = AlwaysEqual;
      // 可以在这里实现某些 trait 或使用 subject 作为标记
  }

如何实例化结构体 

1.实例化普通结构体
  let point = {x:10, y:20}

2.使用结构体更新语法

假如你有一个现有结构体,并且想创建一个新的实例,但只需要更改其中一部分,就可以使用结构体更新语法
struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

fn main() {
    let user1 = User {
        username: String::from("john_doe"),
        email: String::from("john@example.com"),
        sign_in_count: 1,
        active: true,
    };

    // 使用结构体更新语法创建新的实例
    let user2 = User {
        username: String::from("jane_doe"),
        email: String::from("jane@example.com"),
        ..user1 // 复制 user1 的其他字段
    };

    println!("User2: {}", user2.username);
}

3.使用
new函数实例化
struct User {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
}

impl User {
    // 构造函数
    fn 
new(username: String, email: String, sign_in_count: u64, active: bool) -> User {
        
User {
            username,
            email,
            sign_in_count,
            active,
        }
    }
}

fn main() {
    // 使用构造函数创建结构体实例
    let user1 = 
User::new(
        String::from("john_doe"),
        String::from("
john@example.com"),
        1,
        true,
    );

    println!("User: {}", user1.username);
}

3.
元组结构体实例化
struct Color(u8, u8, u8); // 代表 RGB 颜色
struct Point3D(f64, f64, f64);

fn main() {
    let black =
Color(0, 0, 0);
    let origin = Point3D(0.0, 0.0, 0.0);

    println!("Black color: {}, {}, {}", black.0, black.1, black.2);
    println!("Origin point: {}, {}, {}", origin.0, origin.1, origin.2);
}

4.
单元结构体实例化(直接使用结构体名称即可)
struct AlwaysEqual;

fn main() {
    let subject =
AlwaysEqual;

    // 可以在这里实现某些 trait 或使用 subject 作为标记
    println!("Instance of AlwaysEqual created.");
}

结构体的所有权结构体所有权的规则
  1.创建结构体时,就相当于书架上上了新书,这些新书(字段)属于这个书架
     let bookshelf = bookshelf {
        book1:"书1",
        book2:"书2"
     }

  2.赋值和转移, 当你把这个书架(结构体实例)给了别人,别人获得了这个书架和这个书架
上的书,这些东西都不属于你了
     let friendshelf = myshelf   //书架给了你朋友你 不属于你了

  3.使用引用:如果你只想让别人看书架和书,不想给给人,可以用
&来借用结构体字段
    fn show_books(bookshelf: &Bookshelf) {
        println!("书架上有:{} 和 {}", bookshelf.book1, bookshelf.book2);
     }
     show_books(&my_bookshelf); // 借用书架上的书来展示,`my_bookshelf` 依然有效
    
如何输出结构体如何输出结构体
 1.在最开头写    #[derive(Debug)]
 2.输出的时候用 
{:?}这种格式  println!("rect1 is {:?}", rect1);
结构体方法1.结构体方法写在impl
2.结构体方法的第一个参数是self 可以是self   &self   &mut self
  &self:借用结构体实例 不允许修改
    &mut self:可变引用 允许修改结构体实例
    self: 移动结构体实例 方法结束后实例不再有效
示例
  1.struct Rectangle {
       width:u32,
       height:u32,
    }
  2.impl Rectangle{
      fn area($self) -> u32 {
          self.width * self.height
      }
    }
结构体关联函数 1.在impl中 却没有 &self参数
2.不需要示例(实例化后的结构体),但需要声明在哪个impl中
#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}

impl Rectangle {
    fn create(width: u32, height: u32) -> Rectangle {
        Rectangle { width, height }
    }
}

fn main() {
    let rect = Rectangle::create(30, 50);
    println!("{:?}", rect);
}
要在 C# 中调用 Rust 函数并返回结构体对象,可以使用 Rust 的 FFI(Foreign Function Interface)功能和 C# 的 Marshaling 功能来实现。 以下是一个基本的示例,假设 Rust 函数返回一个包含两个整数字段的结构体对象: 1. 在 Rust 中定义一个包含两个整数字段的结构体,并实现一个返回结构体对象的函数。 ```rust #[repr(C)] pub struct MyStruct { pub field1: i32, pub field2: i32, } #[no_mangle] pub extern "C" fn rust_function() -> MyStruct { MyStruct { field1: 1, field2: 2 } } ``` 2. 将 Rust 代码编译为动态链接库,使用命令行参数 --crate-type=cdylib。 ```bash $ rustc --crate-type=cdylib rust_lib.rs ``` 3. 在 C# 中使用外部函数声明 (DllImport) 和 C语言调用约定 (Calling Convention) 来声明 Rust 函数,并指定返回值类型为 IntPtr。 ```csharp using System; using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] public struct MyStruct { public int field1; public int field2; } class Program { [DllImport("rust_lib.dll", CallingConvention = CallingConvention.Cdecl)] public static extern IntPtr rust_function(); static void Main(string[] args) { // 调用 Rust 函数并获取返回值指针 IntPtr ptr = rust_function(); // 将返回值指针转换为结构体对象 MyStruct result = Marshal.PtrToStructure<MyStruct>(ptr); // 打印结构体字段值 Console.WriteLine("Field1: " + result.field1); Console.WriteLine("Field2: " + result.field2); } } ``` 在上面的示例中,我们将 Rust 中的结构体类型显式地指定为 C 语言的结构体布局(#[repr(C)]),并将 C# 中的结构体类型与之相对应([StructLayout(LayoutKind.Sequential)])。然后,在 C# 中使用 Marshal.PtrToStructure 将返回值指针转换为结构体对象,从而实现了 Rust 函数返回结构体对象在 C# 中的使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

simper_zxb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值