Variables and Mutability(变量和可变性)

  • 变量声明有三种:不变量(运行期的常量),变量以及(编译期的)常量。
  • 变量可以重复绑定,后声明的变量覆盖前面声明的同名变量,重复绑定时可改变类型。
// 运行期常量(不可变变量 immutable variable)
let x = 5;
x = 6; // compile-time error
// 变量(可变变量 mutable variable)
let mut x = 5;
x = 6;
// 编译期常量(constant)
// 使用常量表达式初始化,必须加上类型声明
const MAX_POINTS: u32 = 100_000;
// 重复绑定(不改变类型)
let x = 5;
let x = x + 1;
let x = x * 2;
// 重复绑定(改变类型)
let spaces = " ";
let spaces = spaces.len();

Data Types(数据类型)

  • Scalar Types(标量类型)

    • Integer Types(整形)

      • i8, u8, i16, u16, i32, u32, i64, u64
      • Decimal, Hex, Octal, Binary, Byte
    • Floating-Point Types(浮点类型)
      • f32, f64
    • Boolean Type(布尔类型)
    • Character Type(字符类型)
  • Compound Types(复合类型)
    • Tuples(元组)
    • Arrays(数组)
// 元组(带类型声明 type annotation)
let tup: (i32, f64, u8) = (500, 6.4, 1);
// 元组(类型自动推导,解构 destructuring)
let tup = (500, 6.4, 1);
let (x, y, z) = tup;
println!("The value of y is: {}", y);
// 元组(使用下标)
let x: (i32, f64, u8) = (500, 6.4, 1);
let five_hundred = x.0;
let six_point_four = x.1;
let one = x.2;
// 数组,大小不可变,分配在栈上
let months = ["January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"];
let a: [i32; 5] = [1, 2, 3, 4, 5];
let a = [3; 5]; // let a = [3, 3, 3, 3, 3];
let a = [1, 2, 3, 4, 5];
let first = a[0];
let second = a[1];

How Functions Work(函数的运行机制)

// 赋值语句不返回值。
let y = {
let x = 3;
// 代码块的最后一句可以是表达式。
// 表达式末尾不带分号。加了分号表达式变语句。
x + 1
};
// 函数的最后一句可以是表达式,表示返回值。
fn five() -> i32 {
5
}
fn plus_one(x: i32) -> i32 {
x + 1
}

Control Flow(控制流)

  • if ... else if ... else 表达式(可以返回值)
  • loop 语句
  • while 语句
  • for ... in 语句(实质是 foreach)

Ownership(所有权)

let mut s = String::from("hello");
s.push_str(", world!"); // push_str() appends a literal to a String
println!("{}", s); // This will print `hello, world!`
let x = 5;
// copy
let y = x;
let s1 = String::from("hello");
// move
let s2 = s1;
// clone
let s2 = s1.clone();
  • 有 Copy 特质的类型在赋值时执行 Copy。

    Copy 特质类型包括整形,浮点型,布尔型等基本类型以及它们所组成的元组。
  • 没有 Copy 特质的类型在赋值时执行 Move。(浅拷贝 + 被赋值的变量失效)
  • 没有 Copy 特质的类型需要深拷贝时需要显式调用 clone 方法。
  • 给函数传参数相当于赋值。
// 移动
let s1 = String::from("hello");
let (s2, len) = calculate_length(s1);
fn calculate_length(s: String) -> (String, usize) {
let length = s.len(); // len() returns the length of a String
(s, length)
}
// 不变引用
let s1 = String::from("hello");
let len = calculate_length(&s1);
fn calculate_length(s: &String) -> usize {
s.len()
}
// 可变引用
let mut s = String::from("hello");
change(&mut s);
fn change(some_string: &mut String) {
some_string.push_str(", world");
}

在同一个作用域对同一份数据

  • 可以有多个不变引用
  • 只能有一个可变引用
  • 不变引用和可变引用不能同时存在

Slices(片段)

存在字符串片段以及数组片段,片段是只读引用。

字符串常量是片段类型。

// 查找字符串中的第一个单词,返回字符串片段类型 &str
fn first_word(s: &String) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[0..i];
}
}
&s[..]
}
// 省略下标
let s = String::from("hello");
let slice = &s[0..2];
let slice = &s[..2];
// 省略下标
let len = s.len();
let slice = &s[3..len];
let slice = &s[3..];
// 省略下标
let slice = &s[0..len];
let slice = &s[..];
// a 的类型是 &[i32]
let a = [1, 2, 3, 4, 5];
let slice = &a[1..3];

Rust语言学习笔记(4)的更多相关文章

  1. Rust语言学习笔记(7)

    模块 // 兄弟模块 mod network { fn connect() { } } mod client { fn connect() { } } // 父子模块 mod network { fn ...

  2. Rust语言学习笔记(5)

    Structs(结构体) struct User { username: String, email: String, sign_in_count: u64, active: bool, } let ...

  3. Rust语言学习笔记(6)

    Traits(特质) // 特质 pub trait Summary { fn summarize(&self) -> String; } pub struct NewsArticle ...

  4. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  5. 2017-04-21周C语言学习笔记

    C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...

  6. 2017-05-4-C语言学习笔记

    C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...

  7. GO语言学习笔记(一)

    GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...

  8. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  9. Go语言学习笔记十三: Map集合

    Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...

随机推荐

  1. 百度,谷歌,360,搜狗,神马等蜘蛛IP段

    https://www.imydl.com/wzjs/5971.html 记得3月份的时候明月分享过一篇[站长必备:百度.谷歌.搜狗.360等蜘蛛常见IP地址]的文章,好像一直都受到了众多站长们的关注 ...

  2. 【jmeter】jmeter之“参数化”

    参数化:简单的来理解一下,我们录制了一个脚本,这个脚本中有登录操作,需要输入用户名和密码,假如系统不允许相同的用户名和密码同时登录,或者想更好的模拟多个用户来登录系统. 这个时候就需要对用户名和密码进 ...

  3. 转Python 和C#的交互

    http://www.cnblogs.com/wilber2013/category/708919.html IronPython和C#交互   IronPython是一个.NET平台上的Python ...

  4. C# 教程

    http://www.runoob.com/csharp/csharp-tutorial.html

  5. sql表设计

    数据库实际上是系统逻辑在磁盘上的固化,是信息河流的蓄水池. 数据库的表应有如下类型 1)类表.配置表.作为业务逻辑基本的名字,状态的定义,作为构建逻辑世界的最基础框架,解释框架的框架. 特点,数据不会 ...

  6. Spring和Quartz集成

    本文转载自:http://blog.csdn.net/u010648555/article/details/54891264 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企 ...

  7. Python 示例 饮水记录

    因为每天都需要喝水  这是非常重要的 目录结构: ├─bin│ │ start.py│ ││ └─__pycache__│ start.cpython-36.pyc│├─core│ │ src.py│ ...

  8. Vuex 状态管理模式

    Vuex 是一个专为 Vue.js 设计的状态管理模式 vuex解决了组件之间同一状态的共享问题.当我们的应用遇到多个组件共享状态时,会需要: 多个组件依赖于同一状态.传参的方法对于多层嵌套的组件将会 ...

  9. java基础:关于java流与文件操作

    1.描述:流是字节数据或字符数据序列.Java采用输入流对象和输出流对象来支持程序对数据的输入和输出.输入流对象提供了数据从源点流向程序的管道,程序可以从输入流对象读取数据:输出流对象提供了数据从程序 ...

  10. vb shell函数在c#的转换

    vb shell: Private Sub AddBarcodeImages(ByVal DTab As DataTable) If Not DTab Is Nothing Then DTab.Col ...