介绍:对新手及一些非C系列开发人员补充一些知识点,供查阅,可跳过
一、什么是标识符
标识符是指常量、 变量、语句标号以及用户自定义函数的名称。
例如,C语言规定标识符只能由字母、数字、 下划线组成,并且只能由字母、下划线开头。
一些标识符被赋于特定的含义就叫做保留字(或称为关键字)
Rust的标识符是所有符合下面规则的非空的unicode字符串
规则1:
A. 无论是首个字符还是首字符外的其它字符的属性涵盖C语言系列和Java语言系列的对标识符首个字符的定义
附注:
(1)C系和Java系的标识符定义规则。
C语言系列标识符定义:C语言规定标识符只能由字母、数字、 下划线组成,并且只能由字母、下划线开头。
Java语言系列标识符定义:Java语言的标识符必须以字母、下划线、美元符开头,后面可以跟任意数目的字母、数字、下划线、美元符。此处的字母并不局限于26个大小写字母,而且可以包含中文字符、日文字符、韩文字符等。
(2)已经作为关键字标识不能再作为标识符使用。
(3)C和Java都区分大小写。
规则2:
首个字符是下划线的情况,标识符是必须超过1个字符大小的,单个下划线不能作为一个标识符存在。
总结:Rust标识符以字母或者下划线开头,后边可以跟任意的字符序列,数字,或者下划线。
二、操作符
Rust语言中的操作符也大体与C系列语言相同。
- 算数运算符有*、/、%、+ 、-(乘、除、取余、加、减)。
另外,- 也是一个一员前置运算符,表示负数。
- 位运算符>>, <<、&、|、和^ 。
另外,如果应用于一个整数值,!反转所有的位(像~ 在C 中的作用一样)。
-
比较操作符有==、!=、<、>、<= 和>= 。
-
短路(惰性)布尔操作符有&&(与)和||(或)。
-
二元操作符as。
将表达式放在左侧,并将需要转化的类型放在右边,如果转换是可行的,那么就会将表达式的结果转换为给定的类型。
通常,as只能用于原始的整数类型或者指针,并且不能重载。transmute可以对同样大小和对齐的类型进行转换。
示例:
let x: f64 = 4.0;
let y: uint = x as uint;
assert!(y == 4u);
三、Rust的代码风格
- 首选的代码风格是:对于函数,变量,模块名使用小写字母,使用下划线提高可读性,
- 自定义类型使用驼峰法。
四、关于下划线
- 可以用于代替数值当中的小数点。
98_222 = 98.222
- 用于消除警告
static MONSTER_FACTOR: f64 = 57.8;
let monster_size: f64 = 10.0;
let monster_size: int = 60; (引发警告warning)
let _monster_size = 60; (消除警告)
五、双冒号::表示命名空间,这与C++相同
use buffer::BufReader;
use net::NetworkStream;
use version::{HttpVersion};
use method::Method;
use header::{Headers, ContentLength, TransferEncoding};
use http::h1::{self, Incoming, HttpReader};
use http::h1::HttpReader::{SizedReader, ChunkedReader, EmptyReader}; //表示引用这个包里的3个模块
use uri::RequestUri;
- 包路径Path,也即是命名空间使用::分隔,与C++类似。
如:x::y::z;
A. 如果是以::开头,则表示全局路径的开始,被认为是组件开始的根路径
moda {
pubfnfoo() {}
}
modb {
pubfnfoo() {
::a::foo(); // call a's foo function
}
}
B.如果以super::开头,表示调用父模块的方法
moda {
pubfnfoo() {}
}
modb {
pubfnfoo() {
super::a::foo(); // call a's foo function
}
}
C.如果以self::开头,表示调用本模块的方法
fnfoo() {}
fnbar() {
self::foo();
}
六、特殊属性
在Rust中声明可以用“属性”标注,它们看起来像:
#[test]
或者 #![test]
案例1
#[foo]
struct Foo;
mod bar {
#![bar]
}
#[foo] 作用于下一个项,在这就是struct声明。
#![bar] 作用于包含它的项,在这是mod声明。否则,它们是一样的。它们都以某种方式改变它们附加到的项的意义。
案例2
#[test]
fn check() {
assert_eq!(2, 1+1);
}
这意味着它是特殊的:当你运行测试,这个函数将会执行。当你正常编译时,它甚至不会被包含进来。这个函数现在是一个测试函数。
属性也可以有附加数据
#[inline(always)]
fn super_fast_fn() {
或者甚至是键值:
#[cfg(target_os = "macos")]
mod macos_only {
#[derive(Debug)] struct Point { x: i32, y: i32, } Rust属性被用在一系列不同的地方。在参考手册中有一个属性的全表。目前,你不能创建你自己的属性。