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. JUC集合之 CopyOnWriteArrayList

    CopyOnWriteArrayList介绍 它相当于线程安全的ArrayList.和ArrayList一样,它是个可变数组:但是和ArrayList不同的时,它具有以下特性: 它最适合于具有以下特征 ...

  2. matplotlib y轴标注显示不全以及subplot调整的问题

    matplotlib y轴标注显示不全以及subplot调整的问题 问题: 我想在y轴显示的标注太长,想把它变成两行显示,发现生成的图形只显示的第二行的字,把第一行的字挤出去了 想要的是显示两行这样子 ...

  3. 转 Fiddler导出jmeter脚本

    前提条件:                1.下载安装抓包工具Fiddler                2.下载Fiddler插件,参考下载地址:http://download.csdn.net/ ...

  4. Linux中的其他命令

    1.  修改文件的所有者 chown 用户名  文件名 2. 修改文件所属组 chgrp 组名  文件名 3. 创建用户,创建组,将用户添加到组中等 修改film文件夹的所有者和所属组 修改film文 ...

  5. arcgis license manager 10.2服务无法启动

    (步骤)1. 用cmd切换到 license manager 安装目录,如 C:\Program Files (x86)\ArcGIS\License10.2\bin,输入: Lmgrd -z -c ...

  6. bootstrap+font-awesome表单

    bootstrap+font-awesome表单 <form action="" class="form-horizontal col-sm-offset-4&qu ...

  7. VS2010安装选项中有个“图标库”

    位置 :\Program Files\Microsoft Visual Studio 10.0\Common7\VS2010ImageLibrary\2052\VS2010ImageLibrary.z ...

  8. android studio 更新 Gradle错误解决方法(Gradle sync failed)

    android studio 更新 Gradle错误解决方法   Android Studio每次更新版本都会更新Gradle这个插件,但由于长城的问题每次更新都是失败,又是停止在Refreshing ...

  9. python处理excel(二):写

    代码参考自zhoujie.函数接口可参考该blog. 基本的write函数接口很简单: 新建一个excel文件 file = xlwt.Workbook() (注意这里的Workbook首字母是大写) ...

  10. shelve的简单使用

    shelve类似于一个key-value数据库,可以很方便的用来保存Python的内存对象,其内部使用pickle来序列化数据,简单来说,使用者可以将一个列表.字典.或者用户自定义的类实例保存到she ...