包含标签 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));} 可以发现非常冗余,那么如何解决这种问题?可以使用Trait,先看Trait的定义 1……

阅读全文

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);fn main(){foo()} Repeat 可以使用宏来进行递归 1 2 3 4 5 6 7 8 9 10 11……

阅读全文

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);implInches{fn to_centimeters(&self)-> Centimeters{let&Inches(inches)=self;Centimeters(inchesasf64*2.54)}}fn main(){letfoot=Inches(12);letmeter=Centimeters(100.0);letcmp=iffoot.to_centimeters()<meter{"smaller"}else{"bigger"};println!("{}",cmp);} 在这里,首先定义了Centimeters,同时重载了比较运算符,在接下来的代码中,可以对该结构体进行比较。 dyn Rust编译器需要知道返回类型的大小,……

阅读全文

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,}implVal{pubfn value(&self)-> &f64 {&self.val}}fn main(){letx=Val{val: 3.};lety=x.value();} trait(接口) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 //定义接口 traitHasArea{fn area(&self)-> f64;}struct Rectangle{length: f64,height: f64 }// 实现接口 implHasAreaforRectangle{fn area(&self)-> f64……

阅读全文

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()`");}// 可见 pubfn function(){println!("called `my_mod::function()`");}// 可以嵌套 pubmod nested{pubfn function(){println!("called `my_mod::nested::function()`");}}}mod my{// struct默认是私有的 pubstruct OpenBox<T>{pubcontents: T,}#[allow(dead_code)]pubstruct ClosedBox<T>{contents: T,}impl<T>ClosedBox<T>{pubfn new(contents: T)-> ClosedBox<T>{ClosedBox{contents: contents,}}}} 包可见性 Crates 在Rust中,crates是一个compilation unit,默认是编译成可执行文件,如……

阅读全文

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>);implPair{fn destory(self){letPair(x,y)=self;println!("Destroying Pair({}, {})",x,y);}} 闭包(也称之为lambda表达式) 1 2 3 fn function(i: i32)-> i32 {i+1}letclosure_annotated=|i: i32|-> i32 {i+1};letone=||1; 下面看一下指针借用 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 fn main(){lethaystack=vec![1,2,3];letcontains=move|needle|haystack.contains(needle);println!("{}",contains(&1));println!("{}",contains(&4));println!("There're {} elements in vec",haystack.len());// ^ Uncommenting above line will result in compile-time error // because borrow checker doesn't……

阅读全文

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(){letn=5;ifn<0{print!("{} is negative",n);}elseifn>0{print!("{} is positive",n);}else{print!("{} is zero",n);}letbig_n=ifn<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循环 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 fn main(){letmutcount=0u32;println!("Let's count until infinity!");loop{count+=1;ifcount==3{println!("three");continue;}println!("{}",count);ifcount==5{println!("OK, that's enough");break;}}}fn main(){letmutcounter=0;letresult=loop{counter+=1;ifcounter==10{breakcounter*2;}};assert_eq!(result,20);} for 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15……

阅读全文

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 usestd::convert::From;#[derive(Debug)]struct Number{value: i32,}implFrom<i32>forNumber{fn from(item: i32)-> Self{Number{value: item}}}fn main(){letnum=Number::from(123);println!("{:#?}",num);letx=5;letnum: Number=x.into();println!("{:#?}",num);} 实现了From这个traits,就能够同时使用from以及into,用来从类型之间的转换。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 usestd::fmt;struct Circle{radius: i32 }implfmt::DisplayforCircle{fn fmt(&self,f: &mutfmt::Formatter)-> fmt::Result{write!(f,"Circle of radius {}",self.radius)}}fn main(){letcircle=Circle{radius: 6};println!("{}",circle.to_string());} 从String转变 1 2 3……

阅读全文

Rust by Example(chapter4-5)

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

阅读全文