01 2022 档案

摘要:使用 enum 定义枚举类型。 比如,通过 enum 声明一个名为 IpAddrKind 的枚举,其包含所有可能的 IP 地址种类 —— V4 和 V6,在 Rust 中 V4 和 V6 这些枚举可能 出现的情况被称为 枚举变体(variant): enum IpAddrKind { V4, V6, 阅读全文
posted @ 2022-01-31 15:17 鱼又悲 阅读(162) 评论(0) 推荐(0) 编辑
摘要:除了 方法,Rust块还允许我们定义不用接收 self 作为参数的函数。由于这类函数与结构体相互关联,所以它们也被称为 关联函数(associated function)。我们将其命名为函数而不是方法,是因为它们不会作用域某个具体的结构体实例。比如,曾经接触过的 String::from 就是关联函 阅读全文
posted @ 2022-01-31 14:18 鱼又悲 阅读(290) 评论(0) 推荐(0) 编辑
摘要:使用 fn 关键字声明 方法 (与 函数 相似)。 方法与函数的区别是:方法总是被定义在某个结构体(或者枚举类型、trait对象)的上下文中,并且它们的第一个参数永远是 self ,用于指代调用该方法的结构体实例。 定义方法的格式: impl 结构体名 { 方法 } 示例程序: #[derive(D 阅读全文
posted @ 2022-01-31 12:44 鱼又悲 阅读(97) 评论(0) 推荐(0) 编辑
摘要:Rust为结构体提供了打印调试信息的功能,但是默认不启用。要启用这个功能,需要在结构体定义前添加注解: #[derive(Debug)] 然后再使用 {:?} 或 {:#?}(后者更易读一些) 在 println! 中输出。 示例程序: #[derive(Debug)] struct User { 阅读全文
posted @ 2022-01-31 12:20 鱼又悲 阅读(2170) 评论(0) 推荐(0) 编辑
摘要:在 $HOME/.cargo/config (默认没有这个文件,需要新建)中添加如下内容: [source.crates-io] replace-with = 'ustc' [source.ustc] registry = "git://mirrors.ustc.edu.cn/crates.io-i 阅读全文
posted @ 2022-01-30 19:19 鱼又悲 阅读(383) 评论(0) 推荐(0) 编辑
摘要:我们在定义一个新的结构体变量时可以使用已有的成员的属性来更新。 下面的程序使用 结构体更新语法 根据其他结构体实例创建新的结构体实例。 示例程序: struct Student { name: String, chinese: u32, math: u32, science: u32, englis 阅读全文
posted @ 2022-01-30 12:19 鱼又悲 阅读(229) 评论(0) 推荐(0) 编辑
摘要:字段初始化简写(field init shorthand):在字段名与变量名相同时,不需要使用 字段名: 变量名 的形式,而直接使用 字段名 的形式。 示例程序: struct User { username: String, email: String, sign_in_count: u64, a 阅读全文
posted @ 2022-01-30 12:10 鱼又悲 阅读(518) 评论(0) 推荐(0) 编辑
摘要:Rust 中使用 struct 关键字定义并实例化结构体。 示例程序: struct User { username: String, email: String, sign_in_count: u64, actice: bool, } fn main() { let user1 = User { 阅读全文
posted @ 2022-01-29 15:46 鱼又悲 阅读(132) 评论(0) 推荐(0) 编辑
摘要:示例程序: fn main() { let a = [1, 2, 3, 4, 5]; let slice = &a[1..3]; for (i, &item) in slice.iter().enumerate() { println!("{} : {}", i, item); } } 这里的切片类 阅读全文
posted @ 2022-01-29 15:37 鱼又悲 阅读(120) 评论(0) 推荐(0) 编辑
摘要:字符串切片:指向String对象某个连续部分的引用。 使用形式:[starting_index..ending_index],其中 starting_index 是切片起始位置的索引值,ending_index 是切片终止位置的下一个位置的索引值。 示例程序: fn main() { let s = 阅读全文
posted @ 2022-01-29 12:56 鱼又悲 阅读(326) 评论(0) 推荐(0) 编辑
摘要:示例程序: fn main() { let s = String::from("yuyoubei"); let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { println!("{} {}", i, item a 阅读全文
posted @ 2022-01-27 23:11 鱼又悲 阅读(3487) 评论(0) 推荐(0) 编辑
摘要:引用规则: 在任何一个给定的时间里,要么只能拥有一个可变引用,要么只能拥有任意数量的不可变引用。 引用总是有效的。 阅读全文
posted @ 2022-01-27 17:36 鱼又悲 阅读(59) 评论(0) 推荐(0) 编辑
摘要:悬垂指针:指指向曾经存在但现在已经被释放或被重新分配的内存区域的指针。 避免悬垂引用的方法:不要使用引用/指针(使用变量就可以了)。 阅读全文
posted @ 2022-01-27 17:34 鱼又悲 阅读(139) 评论(0) 推荐(0) 编辑
摘要:示例程序: fn main() { let mut s = String::from("hello"); make_yuyoubei(&mut s); println!("{}", s); // 输出 yuyoubei } fn make_yuyoubei(s: &mut String) { *s 阅读全文
posted @ 2022-01-26 22:51 鱼又悲 阅读(401) 评论(1) 推荐(0) 编辑
摘要:& 代表引用语义,它允许你在不获取变量的所有权的情况下使用值。 借用(borrowing):用过 引用 传递参数给函数的过程。 引用默认是不可变的。 示例程序: fn main() { let s = String::from("yuyoubei"); let len = get_len(&s); 阅读全文
posted @ 2022-01-26 22:12 鱼又悲 阅读(159) 评论(0) 推荐(0) 编辑
摘要:Rust中在函数返回值的时候也会发生作用域的转移。 示例程序: fn main() { let s1 = gives_ownership(); let s2 = String::from("hello"); let s3 = takes_and_gives_back(s2); } fn gives_ 阅读全文
posted @ 2022-01-26 12:24 鱼又悲 阅读(193) 评论(0) 推荐(0) 编辑
摘要:示例程序: fn main() { let s = String::from("yuyoubei"); // 变量s进入作用域 takes_ownership(s); // s的值被移进了函数,所以它从这里开始不再有效 let x = 5; // 变量x进入了作用域 makes_copy(x); / 阅读全文
posted @ 2022-01-25 12:13 鱼又悲 阅读(41) 评论(0) 推荐(0) 编辑
摘要:示例程序: fn main() { let x = 123; let y = x; println!("x = {}, y = {}", x, y); // 输出 x = 123, y = 123 } 上述程序中,在创建变量 y 之后,变量 x 继续有效。(而不会想 String 的赋值一样发生移动 阅读全文
posted @ 2022-01-24 18:10 鱼又悲 阅读(947) 评论(0) 推荐(0) 编辑
摘要:变量的克隆clone能够拷贝堆内存中的数据。 当确实需要深度拷贝String堆上的数据,而不仅仅时栈数据时,就可以使用clone方法。 例如,下面的程序会将 s1 的内容克隆给 s2(包括栈内存和堆内存上的数据): fn main() { let s1 = String::from("yuyoube 阅读全文
posted @ 2022-01-24 17:59 鱼又悲 阅读(407) 评论(0) 推荐(0) 编辑
摘要:示例程序: fn main() { let s1 = String::from("yuyoubei"); let s2 = s1; println!("s1 = {}", s1); } 运行这段程序会报错,报错信息如下: error[E0382]: borrow of moved value: `s 阅读全文
posted @ 2022-01-24 17:55 鱼又悲 阅读(312) 评论(0) 推荐(0) 编辑
摘要:Rust中的资源获取即初始化(Resource Acquisition Is Initialization, RAII): 内存会自动地在拥有它的变量离开作用域后(即生命周期结束时)进行释放。 Rust会在作用域结束的地方(即 } 处)自动调用 drop 函数。 示例程序: { let mut s 阅读全文
posted @ 2022-01-24 14:40 鱼又悲 阅读(113) 评论(0) 推荐(0) 编辑
摘要:String类型会在堆内存上分配自己需要的存储空间,所以它能够处理在编译时位置大小的文本。 示例: 创建一个空字符串: let s = String::new(); 调用String的from函数根据字符串字面量来创建一个String实例: let s = String::from("yuyoube 阅读全文
posted @ 2022-01-24 12:14 鱼又悲 阅读(512) 评论(0) 推荐(0) 编辑
摘要:变量的作用域:一个对象在程序中有效的范围。 变量从声明的位置开始直到当前作用域结束都是有效的。 下面程序及其注释对变量的有效范围给了具体说明: { // 由于变量s还未被声明,所以它在这里是不可用的 let s = "yuyoubei"; // 从这里开始变量s变得可用 // 执行与s相关的操作 } 阅读全文
posted @ 2022-01-24 12:06 鱼又悲 阅读(127) 评论(0) 推荐(0) 编辑
摘要:Rust中的每一个值都有一个对应的变量作为它的 所有者。 在同一时间内,值有且仅有一个所有者。 当所有者离开自己的作用域时,它持有的值就会被释放掉。 阅读全文
posted @ 2022-01-24 12:01 鱼又悲 阅读(37) 评论(0) 推荐(0) 编辑
摘要:可以使用 for 循环来遍历集合中的每个元素,例如: use std::io; fn main() { let a = [1, 3, 5, 7, 6, 4, 2]; for ele in a.iter() { println!("ele = {}", ele); } } 我们可以配合标准库中的 Ra 阅读全文
posted @ 2022-01-23 18:18 鱼又悲 阅读(1287) 评论(0) 推荐(0) 编辑
摘要:while条件循环一般格式: while 条件表达式 { 循环体 } 它循环判断条件表达式是否成立,若成立,执行循环体的内容,直到条件表达式不成立或者中途使用break等方式退出循环。 下面的程序输入n,循环输出1~n: use std::io; fn main() { let mut s = St 阅读全文
posted @ 2022-01-23 18:12 鱼又悲 阅读(134) 评论(0) 推荐(0) 编辑
摘要:使用break后加表达式的形式返回值。 例如,下面的程序输入n,输出>=n的最小的7的倍数: use std::io; fn main() { let mut s = String::new(); io::stdin().read_line(&mut s).unwrap(); let mut n: 阅读全文
posted @ 2022-01-23 18:09 鱼又悲 阅读(144) 评论(0) 推荐(0) 编辑
摘要:if表达式的格式 if 表达式格式: if 条件表达式 { 代码段 } 它表示“条件表达式”为 true 时执行“代码段”的内容。下面的代码当输入为偶数时输出“even”: use std::io; fn main() { let mut s = String::new(); io::stdin() 阅读全文
posted @ 2022-01-22 20:56 鱼又悲 阅读(511) 评论(0) 推荐(0) 编辑
摘要:语句(statement)指那些执行操作但不返回值得指令;表达式(expression)指会进行计算并产生一个值作为结果的指令。 因为语句不会返回值。所以,在Rust中,不能将一条let语句赋值给另一个变量,如下所示的代码会产生编译时错误: fn main() { let x = (let y = 阅读全文
posted @ 2022-01-22 18:17 鱼又悲 阅读(244) 评论(0) 推荐(0) 编辑
摘要:Rust中使用 fn 关键字定义函数,例如: fn main() { hello_world(); } fn hello_world() { println!("hello,world!"); } 其中第5~7行定义了函数 hello_world,main函数中(第2行)调用了函数 hello_wo 阅读全文
posted @ 2022-01-22 17:59 鱼又悲 阅读(281) 评论(0) 推荐(0) 编辑
摘要:复合类型(compound type)可以将多个不同类型的值组合为一个类型。Rust中提供了两种内置的复合数据类型:元组(tuple)和数组(array)。 元组类型 元组是一个具有 固定长度 的数据集合 —— 你无法在声明结束后增加或减少其中的元素数量。 元素使用逗号分隔放入一对圆括号中。元组每个 阅读全文
posted @ 2022-01-21 20:14 鱼又悲 阅读(760) 评论(0) 推荐(0) 编辑
摘要:Rust中的每一个值都有其特定的数据类型,Rust会根据数据的类型来决定应该如何处理它们。Rust中的两种不同数据类型子集:标量类型(scalar)和复合类型(compound)。 Rust是一门静态类型语言,这意味着它在编译程序的过程中需要知道所有变量的具体类型。大多数时候编译器可以自动推导数据类 阅读全文
posted @ 2022-01-21 19:38 鱼又悲 阅读(277) 评论(0) 推荐(0) 编辑
摘要:示例程序: fn main() { let x = 1; let x = x + 1; let x = x + 2; println!("x = {}", x); // 输出 x = 4 } Rust中的变量隐藏(shadow):重复定义一个同名变量会覆盖掉之前定义的变量。 隐藏机制可以在修改变量的 阅读全文
posted @ 2022-01-21 19:17 鱼又悲 阅读(185) 评论(0) 推荐(0) 编辑
摘要:示例程序: fn main() { const MAX_POINTS : u32 = 100_000; println!("MAX POINTS = {}", MAX_POINTS); } 上述程序定义了一个常量 MAX_POINTS 并赋值为 100000。 Rust 中使用 const 关键字来 阅读全文
posted @ 2022-01-21 19:06 鱼又悲 阅读(444) 评论(0) 推荐(0) 编辑
摘要:示例程序: use std::io; use std::cmp::Ordering; fn main() { loop { let mut s = String::new(); io::stdin().read_line(&mut s).unwrap(); let num : i32 = s.tri 阅读全文
posted @ 2022-01-20 20:04 鱼又悲 阅读(356) 评论(0) 推荐(0) 编辑
摘要:示例程序: use std::io; use std::cmp::Ordering; fn main() { let mut s = String::new(); io::stdin().read_line(&mut s).unwrap(); let num : i32 = s.trim().par 阅读全文
posted @ 2022-01-20 19:52 鱼又悲 阅读(1106) 评论(0) 推荐(0) 编辑
摘要:一个简单的输入样例: use std::io; fn main() { let mut s = String::new(); io::stdin().read_line(&mut s) // 输入一行字符串 .expect("failed to read line."); println!("{}" 阅读全文
posted @ 2022-01-20 18:18 鱼又悲 阅读(705) 评论(0) 推荐(0) 编辑
摘要:fn main() { let mut a = 123; let b = a; a = 321; // b = 321; // 这样写会报错 println!("a = {}, b = {}", a, b); } Rust中,使用 let 创建一个变量(variable)。 在Rust中,变量默认是 阅读全文
posted @ 2022-01-20 17:24 鱼又悲 阅读(221) 评论(0) 推荐(0) 编辑
摘要:笔记日期:2022年1月20日 Rust版本:1.58.0 Rust Playground(在线IDE):https://play.rust-lang.org/ 下载rustup 进入:https://www.rust-lang.org/tools/install 点击“DOWNLOAD RUSTU 阅读全文
posted @ 2022-01-20 13:07 鱼又悲 阅读(1815) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示