Rust语言学习笔记(4)
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(字符类型)
- Integer Types(整形)
- 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)的更多相关文章
- Rust语言学习笔记(7)
模块 // 兄弟模块 mod network { fn connect() { } } mod client { fn connect() { } } // 父子模块 mod network { fn ...
- Rust语言学习笔记(5)
Structs(结构体) struct User { username: String, email: String, sign_in_count: u64, active: bool, } let ...
- Rust语言学习笔记(6)
Traits(特质) // 特质 pub trait Summary { fn summarize(&self) -> String; } pub struct NewsArticle ...
- HTML语言学习笔记(会更新)
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
- 2017-04-21周C语言学习笔记
C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...
- 2017-05-4-C语言学习笔记
C语言学习笔记... ------------------------------------ Hello C语言:什么是程序:程序是指:完成某件事的既定方式和过程.计算机中的程序是指:为了让计算机执 ...
- GO语言学习笔记(一)
GO语言学习笔记 1.数组切片slice:可动态增长的数组 2.错误处理流程关键字:defer panic recover 3.变量的初始化:以下效果一样 `var a int = 10` `var ...
- Haskell语言学习笔记(88)语言扩展(1)
ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...
- Go语言学习笔记十三: Map集合
Go语言学习笔记十三: Map集合 Map在每种语言中基本都有,Java中是属于集合类Map,其包括HashMap, TreeMap等.而Python语言直接就属于一种类型,写法上比Java还简单. ...
随机推荐
- JMeter--详解JMeter配置元件
JMeter配置元件可以用来初始化默认值和变量,以便后续采样器使用.将在其作用域的初始化阶段处理. CSV Data Set Config:被用来从文件中读取数据,并将它们拆分后存储到变量中,适合处理 ...
- MySQL集群Percona XtraDB Cluster安装搭建步骤详解
http://www.linuxidc.com/Linux/2017-05/143501.htm http://blog.csdn.net/thundermeng/article/details/52 ...
- SpringMVC中的重定向和转发的实现
1.请求转发和重定向的区别 请求重定向和请求转发都是web开发中资源跳转的方式. 请求转发是服务器内部的跳转 地址栏比发生变化 只有一个请求相应 可以通过request域对跳转目标的请求 请求重定向是 ...
- mysql分区表之三:MySQL分区建索引[转]
介绍 mysql分区后每个分区成了独立的文件,虽然从逻辑上还是一张表其实已经分成了多张独立的表,从“information_schema.INNODB_SYS_TABLES”系统表可以看到每个分区都存 ...
- s3express截图安装教程
1.安装s3express_setup.exe 2.设置s3express 设置服务器地址setopt -endpoint:s3.cn-north-1.amazonaws.com.cn 设置协议set ...
- 第8章 信号(1)_Linux信号处理机制
1. 信号的基本概念 1.1 基本概念 (1)信号(signal)机制是linux系统中最为古老的进程之间的通信机制,解决进程在正常运行过程中被中断的问题,导致进程的处理流程会发生变化. (2)信号本 ...
- c++并发编程实战 笔记
http://blog.csdn.net/u010087886/article/category/5884745
- css常用字体
宋体 SimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 NSimSun 新细明体 PMingLiU 细明体 Ming ...
- mac mysql中文乱码问题
God,今天看了好多资料,除了让我命令更熟练以外浪费了好多时间. 遇到的问题:写入数据库有中文的时候,显示??? 最后解决办法: 1.打开终端,输入: mysql -u root -p,然后输入mys ...
- virtualenv之python虚拟环境
virtualEnv可以方便的解决不同项目中,对类库的依赖问题.首先将常用的类库安装在系统环境中,然后为每个项目安装独立的类库环境.这样子可以保证每个项目都运行在独立的类库环境中. virtualen ...