rust
varding
一切都在慢慢变化
展开
-
opencv-rust安装与使用
最近在尝试用rust写视频处理代码,用到了opencv-rust这个库,这儿记录下安装过程。另外这个库说明文档比较欠缺,有些opencv接口不容易找到rust对应的调用名称或者方式,这儿将之前整理的接口查找的方法汇总了下。1.windows下安装1.1 llvm这个是动态生成代码需要用到,安装好就行https://releases.llvm.org/download.html1.2 opencv下载opencv安装即可,官网用的choco安装,这个并不是必须的,可以手动安装llvm和opencv原创 2020-11-24 15:22:06 · 6305 阅读 · 0 评论 -
给sublime text3添加rust自动提示
rust sublime text 3 自动提示 auto completion 好用的ide原创 2015-08-11 12:03:45 · 7484 阅读 · 0 评论 -
Sized和?Sized的作用
考虑如下代码,这个是用Foo封装了两个Box类型,Bar把Fn(i32)作为类型传递给Foo并且把Foostruct Foo<T>{ a:Box<T>, b:Box<T>,}struct Bar{ fs:Foo<Fn(i32)>,}fn main(){}这个代码是无法编译通过的,下面是编译器提示:<anon>:7:5: 7:20 error: the trait `co原创 2015-09-09 23:14:39 · 5636 阅读 · 0 评论 -
rust里closure的move和Fn,FnMut,FnOnce
https://www.reddit.com/r/rust/comments/2ti57s/iron_framework_and_lifetime_problems_with/. There seems to be two cases where a captured value is moved, copied or borrowed: when a closure is made (crea原创 2015-09-04 21:50:34 · 2557 阅读 · 0 评论 -
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 · 2946 阅读 · 0 评论 -
调试rust的宏
nightly版本可以用 trace_macros!,具体看这个: http://stackoverflow.com/questions/30200374/how-do-i-debug-macros下面是我写的列子:#![feature(trace_macros)]trace_macros!(true);macro_rules! foo{ ($x:ident,$f:ident)=>{原创 2015-09-05 21:26:33 · 8200 阅读 · 0 评论 -
rust compile plugin的使用方法
具体可以参考这篇文章: https://www.gulshansingh.com/posts/how-to-write-a-rust-syntax-extension/转载 2015-09-06 15:10:19 · 864 阅读 · 0 评论 -
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 · 1789 阅读 · 0 评论 -
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 · 12798 阅读 · 4 评论 -
rust的Iterator
这个文章讲的还是挺详细的,有空了再翻译下http://hoverbear.org/2015/05/02/a-journey-into-iterators/翻译 2015-09-29 15:18:56 · 963 阅读 · 0 评论 -
查找rust平台相关代码的文档
今天查encode_wide这个函数一直找不到,google才发现是online文档的问题rust的online文档是linux上生成的,所以有些windows上的东西查不到,查找与windows相关的doc使用本机上自带的doc具体在安装路径下: share\doc\rust\html\index.html 比如我的: C:\Program Files\Rust nightly 1.5\sh原创 2015-09-29 14:24:59 · 1358 阅读 · 0 评论 -
多个closure引用同一个变量,并且可能需要mut borrow
目前在实现一个事件系统,事件采用保存closure的方式实现,这其中遇到一个比较棘手的问题就是如果其中一个closure用&mut方式捕捉了一个变量,那么其他closure就不可以再用任何方式捕捉这个变量(rust的borrow check系统),并且如果要&mut捕捉还需要把closure的类型写成FnMut,类似这种: add_event<F>(&mut self,f:F) where F:F原创 2015-09-16 10:53:01 · 780 阅读 · 0 评论 -
Rc与Box区别
咋一看觉得这两个概念差的很远,但是有时候他们都可以在不释放资源的情况下把资源从lifetime短的地方传递到lifetime长的地方use std::rc::Rc;#[derive(Debug)]struct Foo(i32);fn main(){ let r:Rc<Foo>; let b:Box<Foo>; { let r1 = Rc::new(Foo(原创 2015-09-16 12:11:32 · 1733 阅读 · 0 评论 -
rust泛型过度使用思考
目前了解来看rust泛型的概念很好,比c++多了很多类型限定和编译时检查,出错提示相对c++来说也特别特别的友好。但任何事物总是有两面性,过度的使用泛型会使得代码极度的膨胀,这个膨胀的速度在我看来比c++的模板快多了1 trait里的默认函数和方法引起的代码膨胀首先来看一段简单的代码:trait Foo{ fn foo(){ println!("foo"); }原创 2015-09-01 11:15:44 · 4323 阅读 · 2 评论 -
使用msvc编译的rustc
目前msvc编译的rustc已经正式放出来了,如果需要链接vc编译的lib还是很方便的,比如.rc(vc的资源文件)可以用vc的RC工具编译成.res(需要改成.lib,不然cargo不认)然后链接到程序里 msvc只需要用社区版就可以,但至少需要2013以上,不然编译会出错 注:gun版的rustc可以用windres+ar打包成lib的曲线方式来链接,麻烦不说还不是完全兼容另外rustc支持原创 2015-11-21 20:52:43 · 3347 阅读 · 0 评论 -
显示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 · 5532 阅读 · 0 评论 -
rust里调试panic
rust在panic以后只会显示一条简单的提示信息: thread ‘’ panicked at ‘index out of bounds: the len is 0 but the index is 19’, ../src/libcollections\vec.rs:1044这个太简单了几乎无法定位出错信息,可以通过设置RUST_BACKTRACE=1来显示更多信息,这个让rust在出错的时原创 2015-10-05 14:20:55 · 3452 阅读 · 1 评论 -
含有重复元素的二分查找算法
rust已经有binary_search了,但不能很好的处理有重复元素的查找。 下面这个是我按照网上查找到的原理自己实现的,这个处理重复元素比较好,如果key有重复,那么总是查找到最小的那个indexfn main() { let s = [0, 0,0,0,0,1,1,1, 1, 1, 1, 2,2,3, 3, 5, 8, 13, 21, 34, 55]; let seek = 1原创 2015-09-18 10:19:17 · 7323 阅读 · 0 评论 -
在rust里使用unstable feature
使用unstable feature的条件和步骤: 1. 只有nightly才可以使用unstable 2. 找到unstable feature的名字 3. #![feature(xxx)]启用这个feature下面是 std::ptr里的as_ref引起的 编译器错误来举例: use of unstable library feature ‘ptr_as_ref’: Option is原创 2015-09-04 09:16:37 · 7064 阅读 · 0 评论 -
给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 · 4104 阅读 · 0 评论 -
在rust里使用c样式的函数指针
Fn(i32)->i32这个是trait,&Fn(i32)->i32这个是trait object,有lifetime的 fn(i32)->i32这种就是c里的函数指针了,这个是没有lifetime的fn hello(i:i32)->i32{ println!("hello:{}",i); i+100}fn hi(f:fn(i32)->i32){ f(3);}struc原创 2015-09-01 16:15:31 · 2623 阅读 · 0 评论 -
rust 用指针类型转换的方法将u8数组(或slice)转换成u32
c语言很方便,直接指针转换就可以了,代码如下:char data[] = {1,2,3,4};int32 s = *(int32*)data;对应的rust转换如下:pub fn convert(pack_data: &[u8]){ let ptr :*const u8 = pack_data.as_ptr(); let ptr :*const u32 =原创 2015-06-10 21:06:54 · 10881 阅读 · 1 评论 -
在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 · 4450 阅读 · 1 评论 -
用泛型实现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 · 3416 阅读 · 0 评论 -
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 · 2153 阅读 · 0 评论 -
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 · 6383 阅读 · 0 评论 -
更改rust工程依赖库的代码放置路径
cargo build会把rust工程的外部依赖的源代码放到~/.cargo目录里(windows下在 user/xxx/.cargo目录里),这个对于移动办公而言很麻烦,需要每次把依赖的库复制带走,否则每次换个电脑都需要重新下载依赖库。这个可以通过设置CARGO_HOME来设置放置依赖代码的位置,如果要设置固定路径直接设置环境变量即可,如下图所示: 在移动办公的时候设置固定路径效果还是不好,如果原创 2015-08-11 13:34:10 · 6356 阅读 · 0 评论 -
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 · 1370 阅读 · 0 评论 -
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 · 1476 阅读 · 0 评论 -
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 · 9997 阅读 · 0 评论 -
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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
理解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 · 2236 阅读 · 0 评论 -
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 · 8538 阅读 · 2 评论 -
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 · 2533 阅读 · 0 评论 -
rust的一些细节
与其说是细节还不如说是一些“废话”,不仔细想的时候会感觉到模棱两可的东西都记录下来trait里的函数和方法可以在其他impl里使用,但是类型自己的impl的函数不能在trait里调用其实这个也比较好理解,可以有很多的type可以实现trait,那么trait就不可能调用某个特定类型自己的方法或者函数;反过来某个类型实现了某个trait则trait的函数必然可以调用struct Foo;impl Fo原创 2015-09-01 09:20:17 · 905 阅读 · 0 评论 -
通过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 阅读 · 0 评论 -
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 阅读 · 0 评论 -
rust map的使用:获取某个key对应的value,如果不存在就插入一个
代码如下: pub fn Write(&mut self,ip :u32,data: &[u8]){ let a = self.adaptors.entry(ip).or_insert(Adaptor::new(ip)); }原创 2015-06-10 16:21:31 · 3263 阅读 · 0 评论