vimer linux kernel 爱好者

rust-cargo-fun-

2021-01-06

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();

下一篇 tar shell 记录

Comments

Content