- 博客(21)
- 资源 (5)
- 收藏
- 关注
原创 rust用BTreeMap保存closure
use std::collections::BTreeMap;struct Foo{ entry:BTreeMap<i32,Box<Fn(i32)->i32>>,}impl Foo{ fn new()->Foo{ Foo{ entry:BTreeMap::new(), } } fn add<F:Fn(i32)->
2015-08-31 15:06:15 1859
原创 rust用struct保存特定trait的引用
结构体保存一个实现了某个trait的引用,只要是保存引用就必须显式的加lifetime,实现如下: (只是保存而已,记不住…)trait DeriveTrait{ fn hello(&self)->i32;}struct Base<'a,T:DeriveTrait+'a>{ pt:&'a mut T,}impl<'a,T:DeriveTrait> Base<'a,T> {
2015-08-31 12:37:38 2529
原创 trait里的默认函数会为每个类型拷贝一份
注意这儿说的是“函数”不是“方法”,也就是说不带self的函数trait Foo{ fn foo(){ println!("foo"); }}struct Bar1;struct Bar2;impl Foo for Bar1{}impl Foo for Bar2{}fn main(){ println!("{:p}",&Bar1::foo); p
2015-08-30 22:35:31 624
原创 理解rust里的移动语义(1)
rust里的移动会发生内容的复制还是名字的取代而不发生复制? 这段代码展示的内容 1. move语义其实就是复制,可以看到move前后的两个变量f,f2的地址是不一样的 2. move只会drop一次,并且是move之后的那个变量f2 3. move之后原来的变量f就失效了,不可以直接访问。这儿通过保存了f的raw指针,通过unsafe查看f对应地址处的数据,可以看到数据已经变成无意义的数据
2015-08-30 19:48:33 2234
原创 rust:打印变量地址
fn main(){ let a:i32 = 5; //&a先转成raw指针,然后再把指针转成usize,这个可以print的 let addr = &a as *const i32 as usize; println!("addr:0x{:X}",addr); //为了验证刚才的地址是不是正确的,我们修改这个指针指向的数据 //pa就是addr对应的r
2015-08-30 14:52:25 8527 2
原创 rust raw pointer使用方法(4)
4、这儿是继续上一篇往下写,上一篇是把*mut c_void指针转成*mut T类型,然后用UFCS来调用,今天是把*mut c_void转成*mut Self来使用,这个其实只需要添加:Sized就可以了,具体代码如下:use std::os::raw::{c_void};//注意这儿必须加Sized,不然p_this转*mut Self编译器会报错,这儿感谢rust 2群里的@ELTONtr
2015-08-28 13:31:14 1474
原创 rust raw pointer使用方法(3)
3、这一篇写个稍微复杂一点的这个例子里的函数接收*mut c_void指针,然后把指针转成T类型的p_self raw指针,再使用rust的UFCS的函数调用方法调用T的方法(T的静态函数就不需要这么复杂了,直接T::xxxx就可以,连p_self都不用传进来)另外还有个比较绕脑子的地方,就是impl Bar<Foo> for Foo,希望大家能仔细看看这儿关键需要掌握的就是 1. &mut f=
2015-08-27 07:53:25 1368
原创 rust里使用thread_local!
thread_local使用很简单,只需要使用这个宏就可以了,不需要任何的use,但是释放资源的时候一定要注意,实现Drop是不可行的下面的代码的Drop是不可行的:use std::ops::Drop;struct Foo;impl Foo{ fn print(&self){ println!("print foo"); } //fn drop(&self){
2015-08-24 14:13:49 6376
原创 rust条件编译
直接看这个吧,用的挺多的条件编译,看起来也挺直观的 http://angrylawyer.github.io/rust-sdl2/src/rand/os.rs.html贴过来大家参考下:pub use self::imp::OsRng;#[cfg(all(unix, not(target_os = "ios")))]mod imp { extern crate libc; use
2015-08-23 18:57:11 2152
原创 显示rust测试时候的print信息
cargo test命令默认是关闭了test里的print输出,这对有时候需要看输出信息很不方便,官方添加了两种方法: https://github.com/rust-lang/rust/commit/6eaa21635e6c6c90e1a0579876bc63581f661f7d 1. 添加--nocapture 参数 2. 设置RUST_TEST_NOCAPTURE 环境变量目前第一种方
2015-08-23 18:31:04 5527
原创 rust一些习惯表达方法
学习rust的朋友可能经常看到Result和Option,虽然不一定直接看到他们本身,但是他们的方法还是常见的,比如:xxx.ok().expect(“…”); 这个xxx一般就是某个函数返回的Result类型了,下面就详细的讲解下他们的来源现在看看rust book里的那个guess game,有这么一段: http://doc.rust-lang.org/book/guessing-game
2015-08-23 13:41:54 12784 4
原创 用泛型实现rust返回类型自动推导
rust可以根据后续的类型提示自动选择返回值类型#[derive(Debug)]struct Foo(i32);#[derive(Debug)]struct FooBar(i32,i32);trait New{ fn new(i:i32)->Self;}impl New for Foo{ fn new(i:i32)->Foo{ Foo(i) }}im
2015-08-22 21:13:21 3415
原创 在rust里使用std::include!宏来包含其他文件
main.rs 里使用include!宏包含了另一个文件foo.rs,这样另一个文件就会被直接包含进来,这个在实现一个很大的impl的时候比较有用,比如这个例子里struct Foo的impl被放在了main.rs和foo.rs里#[macro_use]use std::*;include!("foo.rs");fn main() { let f = Foo; f.print1(
2015-08-22 14:26:30 4443 1
原创 rust raw pointer使用方法(2)
2、指针转换,传递和解引用 这儿用了windows里的一个常用的结构体RECT来做示范 LPRECT是RECT的*mut raw指针,也就是解引用后可以修改指向的数据的值,具体的说明见注释use std::os::raw::{c_void,c_int};//play run on *nix,so use c_int intead of c_long#[derive(Debug)]struct
2015-08-21 11:00:55 1788
原创 rust raw pointer使用方法(1)
1、raw pointer的声明与赋值 这个是c_void类型的用法,可以看到c_void类型的变量是没法赋值的,估计是故意被设计成这样防止滥用,只有*const c_void和*mut c_void才赋值use std::os::raw::{c_void};const NULL:* mut c_void = 0 as *mut c_void;fn main() { let mut c:*
2015-08-21 10:32:10 2945
原创 给rust链接windows下的资源或者c/c++的.o文件
本文是用编译脚本(build.rs)的方式链接windows下的资源原理编译脚本的用法可以看下面这个官方的链接 http://doc.crates.io/build-script.html下面这个是官方的例子,是用gcc将.c文件生成.o,然后ar打包,最后cargo build链接// build.rsuse std::process::Command;use std::env;use st
2015-08-18 16:59:16 4099
原创 通过trait reference来保存 函数、closure 的调用入口
从网上摘录了一些Fn,FnMut,FnOnce的说明,具体可以看看这个链接,不过这个是在rust 1.0之前写的,有些东西过时了 http://smallcultfollowing.com/babysteps/blog/2014/11/26/purging-proc/ 这个是以前的Fn,FnMut,FnOnce的声明,现在1.2.0已经改变了,不过这个更好理解:trait Fn<A,R> { f
2015-08-16 11:06:20 904
原创 rust sugar
&self就是self:&Self,其中Self是调用者的类型struct Rectangle { p1: Point, p2: Point,}impl Rectangle { // This is an instance method // `&self` is sugar for `self: &Self`, where `Self` is the type
2015-08-15 10:57:34 763
原创 rust默认赋值的方法
可以用如下方法给rust的struct默认值方法1,使用 Default::default()给变量赋值:fn main(){let i: i8 = Default::default();let (x, y): (Option<String>, f64) = Default::default();let (a, b, (c, d)): (i32, u32, (bool, bool)) = Def
2015-08-15 10:14:22 9991
原创 更改rust工程依赖库的代码放置路径
cargo build会把rust工程的外部依赖的源代码放到~/.cargo目录里(windows下在 user/xxx/.cargo目录里),这个对于移动办公而言很麻烦,需要每次把依赖的库复制带走,否则每次换个电脑都需要重新下载依赖库。这个可以通过设置CARGO_HOME来设置放置依赖代码的位置,如果要设置固定路径直接设置环境变量即可,如下图所示: 在移动办公的时候设置固定路径效果还是不好,如果
2015-08-11 13:34:10 6335
原创 给sublime text3添加rust自动提示
rust sublime text 3 自动提示 auto completion 好用的ide
2015-08-11 12:03:45 7483
在Go包里添加C代码并且不使用CGO(不需要gcc)
2013-10-13
wxwidgets集成IE浏览器控件
2010-06-10
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人