分类 rust 中的文章

Trait in Rust

Trait in Rust Rust中的Trait非常优美,类似于泛型编程概念。有时候造轮子的时候发现不同的类型具有相同的方法,如果一个个写方法显得不那么友好,比如 1 2 3 4 5 6 7 8 9 10 11 12 fn double_i32(x: i32) -> i32 { x * 2 } fn double_i64(x: i64) -> i64 { x * 2 } fn main() { println!("double 5_i32 == {}", double_i32(5_i32)); println!("double 5_i64 == {}", double_i64(5_i64)); } 可以发现非常冗余,那么如何解决这种问题?可以使……

阅读全文

Rust by Example(chapter17)

标准库 这一章主要介绍标准库,Rust中提供了各种各样的标准库供我们使用。 String vectors Option Result Box Box Box是一个智能指针,在计算机程序中,所有的值都是在栈中分配的,同时是固定大小的。但是可以使用Box来向堆中分配空间,同时返回一个指针,如果指针不在上下文中,那么分配的区域就会被回收。 1 2 3 4 5 6……

阅读全文

Rust by Example(chapter16)

macro_rules! 在Rust中,宏非常之强大,宏就像一个函数一样,但是接着!。However, unlike macros in C and other languages, Rust macros are expanded into abstract syntax trees, rather than string preprocessing, so you don’t get unexpected precedence bugs. 1 2 3 4 5 6 7 8 9 10 // 将() 展开为打印字符 macro_rules! say_hello{ () => { println!("Hello!"); }; } fn main() { say_hello!() } Designators 通过一种宏来创建函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 macro_rules! create_function{ ($func_name:ident) => { fn $func_name() { println!("You called {:?}()", stringify!($func_name)); } }; } create_function!(foo);……

阅读全文

Rust by Example(chapter15)

Derive(派生) 在Rust中,提供了各种各样的派生特性。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #[derive(PartialOrd, PartialEq)] struct Centimeters(f64); struct Inches(i32); impl Inches { fn to_centimeters(&self) -> Centimeters { let &Inches(inches) = self; Centimeters(inches as f64 * 2.54) } } fn main() { let foot = Inches(12); let meter = Centimeters(100.0); let cmp = if foot.to_centimeters() < meter { "smaller" } else { "bigger" }; println!("{}", cmp); } 在这里,首先定义了Centimeters,同时重载了比……

阅读全文

Rust by Example(chapter14)

Generics(泛型) Generics是Rust中的重要内容,能够最大化地减少代码的重复。fn foo<T>(arg: T) { ... }来定义一个函数,传入的参数为T。 1 2 3 4 5 6 7 8 9 10 11 12 struct Val { val: f64, } impl Val { pub fn value(&self) -> &f64 { &self.val } } fn main() { let x = Val { val: 3. }; let y = x.value(); } trait(接口) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16……

阅读全文

Rust by Example(chapter9-13)

模块 & crate & Cargo & Attributes 可见性 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 mod my_mod { // 不可见 fn private_function() { println!("called `my_mod::private_function()`"); } // 可见 pub fn function() { println!("called `my_mod::function()`"); } // 可以嵌套 pub mod nested { pub fn function() { println!("called `my_mod::nested::function()`"); } } } mod my { // struct默认是私有的 pub struct OpenBox<T> { pub contents: T, } #[allow(dead_code)] pub struct ClosedBox<T> { contents: T, } impl<T> ClosedBox<T> { pub fn new(contents: T) -> ClosedBox<T> { ClosedBox { contents: contents, } } } } 包可……

阅读全文

Rust by Example(chapter8)

函数 函数定义 1 2 3 fn fun(v:i32) -> i32{ v + 3 } 定义类型以及返回类型,同时在Rust函数是一个表达式,也就是不需要return。 方法 1 2 3 4 5 6 7 struct Pair(Box<i32>, Box<i32>); impl Pair { fn destory(self) { let Pair(x,y) = self; println!("Destroying Pair({}, {})", x, y); } } 闭包(也称之为lambda表达式) 1 2 3 fn function(i: i32) -> i32 { i + 1 } let closure_annotated = |i: i32| -> i32 { i + 1 }; let one = || 1; 下面看一下指针……

阅读全文

Rust by Example(chapter7)

Rust是一个现代的系统级编程语言,侧重于安全、速度和并发。 条件控制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 fn main() { let n = 5; if n < 0 { print!("{} is negative", n); } else if n > 0 { print!("{} is positive", n); } else { print!("{} is zero", n); } let big_n = if n < 10 && n > -10 { println!(", and is a small number, increase ten-fold"); 10 * n } else { println!(", and is a big number, halve the number"); n / 2 }; println!("{} -> {}", n, big_n); } loop循环……

阅读全文

Rust by Example(chapter6)

Conversion Rust的核心就是traits,可以重载。 From and To 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 use std::convert::From; #[derive(Debug)] struct Number { value: i32, } impl From<i32> for Number { fn from(item: i32) -> Self { Number { value: item } } } fn main() { let num = Number::from(123); println!("{:#?}", num); let x = 5; let num: Number = x.into(); println!("{:#?}", num); } 实现了From这个traits,就能够同时使用from以及into,用来从类型之间的转换。 1……

阅读全文

Rust by Example(chapter4-5)

变量绑定 简单的例子 1 2 3 4 //如果不使用会有警告 let noisy_unused_variable = 2u32; //前面添加了下划线就不会有警告 let _noisy_unused_variable = 2u32; Mutability 如果申请一个变量可以变化的话,那么就需要 1 let mut mutable_binding = 1; 变量作用域与变量名掩盖(Scope and Shadowing) 1 2 3 4 5 6 7 8 fn main() { let a = 3; { let a = 4; println!("{}", a); } println!("{}", a); } cast(强制转换) 1 2 3 4 5 6 7 8 9 10……

阅读全文