cargo
cargo init
初始化一个rust项目。
vimer@host:~/test/rust_2$ ls
Cargo.toml src/
rust的源代码可以放在这个目录下面。
cargo run
vimer@host:~/test/rust_2$ cargo run
Compiling rust_2 v0.1.0 (/home/vimer/test/rust_2)
Finished dev [unoptimized + debuginfo] target(s) in 0.13s
Running `target/debug/rust_2`
Hello, world!
cargo run可以直接执行rust程序(当然是经过编译过后的),这样就省去了编译、执行的过程。
mod
这个方式和python的import的道理是相同的。例子:
vimer@host:~/test/rust_2/src$ cat print.rs
pub fn run(){
println!("hell from run");
}// 这里必须有 pub 修饰词
main.rs:
vimer@host:~/test/rust_2/src$ cat main.rs
mod print; // 引入文件名,去掉后缀名
fn main() {
println!("Hello, world!");
print::run(); // mod name and fun
}
执行后的结果为:
vimer@host:~/test/rust_2/src$ cargo run
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `/home/vimer/test/rust_2/target/debug/rust_2`
Hello, world!
hell from run
functions
再次强调一遍, 如果引入外部的函数,需要在声明函数的时候键入关键词pub
.
fn greeting(greet: &str, name: &str){
println!("{}, {},nice to meet you", greet, name);
}
fn main() {
greeting("hello,", "vimer")
} // 参数,使用 &str表示表类型
返回值:
// 返回值, 使用->进行暗示
fn add(n1: i32, n2: i32) -> i32{
n1 + n2
} // 注意 n1 + n2 后面没有 ;
fn main() {
let get_sum = add(5,3);
println!("Sum: {}", get_sum);
}
还有一种近似的函数:
let add_nums = |n1:i32, n2:i32| n1 + n2 + n3;
println!("C sum: {}", add_nums(3,3));
// print 16
point_ref
这个应该和C的指针差不多。
let arr1 = [1,2,3];
let arr2 = arr1;
println!("Values: {:?}", (arr1, arr2));
// print
//
//Vector
let vec1 = vec![1,2,3];
let vec2 = &vec1;
println!("Values: {:?}", (&vec1, vec2));
// Values: ([1, 2, 3], [1, 2, 3])
// Values: ([1, 2, 3], [1, 2, 3])
structs
struct Color {
red: u8,
green: u8,
blue: u8,
}
fn main() {
let mut c = Color {
red: 255,
green: 0,
blue: 0,
};
println!("Color : {} {} {}", c.red, c.green, c.blue);
}
还有下面的这种方式也行:
struct Test (u8, u8, u8);
let mut c = Test(255, 0, 0);
一个更复杂的例子:
struct Person{
first_name: String,
last_name: String,
}
impl Person{
// Construct
fn new(first: &str, last: &str) -> Person{
Person {
first_name: first.to_string(), // Convert original struct member
last_name: last.to_string(),
}
}
// Get full name
// format?
fn full_name(&self) -> String {
format!("{} {}", self.first_name, self.last_name)
}
// Set last name
// ??
fn set_last(&mut self, last:&str) {
self.last_name = last.to_string();
}
// Name to tupel
fn to_tuple(self) ->(String, String) {
(self.first_name, self.last_name)
}
}
fn main(){
let mut p = Person::new("Mary", "Doe");
println!("Full name is {}", p.full_name());
p.set_last("vimer");
println!("Full name is {}", p.full_name());
println!("Tuple name is {:?}", p.to_tuple());
}
/* output:
Full name is Mary Doe
Full name is Mary vimer
Tuple name is ("Mary", "vimer")
*/
函数有返回值的,函数体没有最后的”;”.
enum
enum Movement {
Up,
Down,
Left,
Right
}
fn move_avator(m: Movement) {
match m {
Movement::Up => println!("Up"),
Movement::Down => println!("Down"),
Movement::Left => println!("Left"),
Movement::Right => println!("Right")
}
}
fn main(){
let avatar1 = Movement::Up;
let avatar2 = Movement::Down;
let avatar3 = Movement::Left;
let avatar4 = Movement::Right;
move_avator(avatar1);
move_avator(avatar2);
move_avator(avatar3);
move_avator(avatar4);
}
/* output:
Up
Down
Left
Right
*/
还是要注意 match 中的符号问题。
args
use std::env;
fn main(){
let args: Vec<String> = env::args().collect();
println!("Args: {:?}", args);
}
// Args: ["/home/vimer/test/rust_2/target/debug/rust_2"]
vimer@host:~/test/rust_2/src$ cargo run hello
Finished dev [unoptimized + debuginfo] target(s) in 0.00s
Running `/home/vimer/test/rust_2/target/debug/rust_2 hello`
Args: ["/home/vimer/test/rust_2/target/debug/rust_2", "hello"]
let cmd = args[1].clone();