javascript结构体-学习 Rust 结构

指导

Rust 语言是一种高效、可靠、通用的高级语言。 它的效率不仅限于开发效率,它的执行效率也是惊人的。 是一种少有的兼具开发效率和执行效率的语言。

Rust 中的 Struct 和 Tuple 都可以将多个不一定是同一类型的数据捆绑在一起创建一个整体,但结构的每个成员及其本身都有一个名称,因此您可以像这样访问它,不需要记住当您是会员时下标。 元组通常用于未定义的多值传输,而结构则用于标准化常用的数据结构。 该结构的每个成员称为“字段”。

结构定义

这是一个结构体定义:

struct Site {
    domain: String,
    name: String,
    nation: String,
    found: u32
}

注意:如果你经常使用C/C++,请记住,在Rust中,struct语句仅用于定义,不能声明实例。 不需要 ; 符号位于末尾,每个数组在定义后用, 分隔。

结构实例

Rust 在很多地方都受到 JavaScript 的影响。 实例化结构体时,使用 JSON 对象的 key: value 语法来实现定义:

例子

let runoob = Site {
    domain: String::from("www.runoob.com"),
    name: String::from("RUNOOB"),
    nation: String::from("China"),
    found: 2013
};

如果您不知道 JSON 对象,您可以不用管它,只需记住格式即可:

结构体类名 {
    字段名 : 字段值,
    ...
}

这样做的目的是除了让程序更加直观之外,不需要按照定义的顺序输入成员的值。

如果正在实例化的结构体有一个与现有变量同名的数组,则可以简化编写:

例子

let domain = String::from("www.runoob.com");
let name = String::from("RUNOOB");
let runoob = Site {
    domain,  // 等同于 domain : domain,
    name,    // 等同于 name : name,
    nation: String::from("China"),
    traffic: 2013
};

有一种情况:你想创建一个结构体的新实例,大部分属性需要设置为与现有结构体的属性相同javascript结构体,并且只需要修改其中一个或一个的值两个数组。 您可以使用结构更新句子模式:

let site = Site {
    domain: String::from("www.runoob.com"),
    name: String::from("RUNOOB"),
    ..runoob
};

注意:..runoob 后面不能有冒号。 这个句型不允许对另一个结构体实例进行不可变的复制,这意味着至少重置一个数组的值可以引用其他实例的值。

元组结构

有一种更简单的方法来定义和使用结构:元组结构。

元组结构是元组的结构。

与元组的区别在于它有名称和固定的类型格式。 它存在的目的是处理需要定义类型(经常使用)但又不想太复杂的简单数据:

struct Color(u8, u8, u8);
struct Point(f64, f64);
let black = Color(0, 0, 0);
let origin = Point(0.0, 0.0);

“颜色”和“点坐标”是两种常用的数据类型,但如果在实例化时写大括号和两个名称,则为了可读性而牺牲了便利性。 Rust 不会留下这个问题。 。 元组结构对象的使用方式与元组相同,通过 . 和下标:

例子

fn main() {
    struct Color(u8, u8, u8);
    struct Point(f64, f64);
    let black = Color(0, 0, 0);
    let origin = Point(0.0, 0.0);
    println!("black = ({}, {}, {})", black.0, black.1, black.2);
    println!("origin = ({}, {})", origin.0, origin.1);
}

运行结果:

black = (0, 0, 0)
origin = (0, 0)

结构所有权

该结构必须拥有数组值的所有权,因为当该结构无效时,所有数组都将被释放。

这就是本章示例中使用 String 类型而不是 &str 的原因。

但这并不意味着结构体中没有定义引用数组,需要通过“生命周期”机制来实现。

但仍然无法解释“生命周期”的概念,所以只能在前面的章节中进行解释。

输出结构

在调试过程中,完整显示结构实例非常有用。 但如果我们自动写一个格式,那就很不方便了。 因此 Rust 提供了一种输出整个结构的便捷方法:

例子

#[derive(Debug)]
struct Rectangle {
    width: u32,
    height: u32,
}
fn main() {
    let rect1 = Rectangle { width: 30, height: 50 };
    println!("rect1 is {:?}", rect1);
}

如第一行所示:必须导出调试库#[derive(Debug)],然后可以在 println 和 print 宏中使用 {:?} 占位符输出整个结构:

rect1 is Rectangle { width: 30, height: 50 }

如果属性较多,可以使用另一个占位符{:#?}。

输出结果:

rect1 is Rectangle {
    width: 30,
    height: 50
}

结构方式

Method与Function类似javascript结构体,只不过它是用来操作结构体实例的。

如果你学过一些面向对象的语言,那么你一定很清楚,函数通常放在类定义中,并在函数中使用this来表示正在操作的实例。

Rust语言不是面向对象的,从其所有权机制的创新就可以看出。 但很少有面向对象的想法可以在 Rust 中实现。

结构体方法的第一个参数必须是&self,并且不需要声明类型,因为self不是样式而是关键字。

计算圆的面积:

例子

struct Rectangle {
    width: u32,
    height: u32,
}
   
impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
}
fn main() {
    let rect1 = Rectangle { width: 30, height: 50 };
    println!("rect1's area is {}", rect1.area());
}

输出结果:

rect1's area is 1500

请注意,调用结构体方法时不需要填写self。 这是为了使用方便。

多参数示例:

例子

struct Rectangle {
    width: u32,
    height: u32,
}
impl Rectangle {
    fn area(&self) -> u32 {
        self.width * self.height
    }
    fn wider(&self, rect: &Rectangle) -> bool {
        self.width > rect.width
    }
}
fn main() {
    let rect1 = Rectangle { width: 30, height: 50 };
    let rect2 = Rectangle { width: 40, height: 20 };
    println!("{}", rect1.wider(&rect2));
}

运行结果:

false

该程序估计 rect1 是否比 rect2 宽。

结构关联功能

“struct method”不称为“struct function”的原因是因为“function”这个名称是为这些函数保留的:它在 impl 块中没有 &self 参数。

该函数不依赖于实例,但使用它需要在该 impl 块中进行声明。

已使用的 String::from 函数是“关联函数”。

例子

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

运行结果:

Rectangle { width: 30, height: 50 }

提示:结构体impl块可以写多次,效果相当于将它们的内容拼接起来!

单元结构

结构体可以表示为没有任何成员的值:

struct UnitStruct;

我们将这些没有主体的结构称为单元结构。

原文来自: