Entries tagged “#rust”

Tue 08 October 2019

Rust中的泛型,trait以及trait objects小记

泛型的使用 泛型的英文为Generic Types,顾名思义就是通用类型。泛型可以帮助我们减少样板代码的编写。设想一下,如果需要为在一个元素为i32的数组中找出最大的那个数,大部分人都会写一个将这部分代码写成一个函数。形如 fn largest(list: &[i32]) -> i32 { let mut largest = list[0]; for &item in list.iter() { if item > largest { largest = item; } } largest } 嗯~~ 正常运行。不过之后产品经理增加需求,需要同时支持i64数组,然后又想支持f64数组。在没有泛型的语言中,开发人员只能选择将这个函数复制粘贴n次,对参数类型稍加修改,最后改成不同的名字,如largest_i32 、largest_i64等。而且,这种情况下,当你需要改变代码时,也需要重复修改多次,这些都或多或少地增加了代码的维护成本。但是泛型的出现,可以减少开发者很多重复的劳动 ... read more
Fri 06 September 2019

Vscode和Rust nightly的简单配置

本人的常用IDE是小巧的vscode,之前写Rust的时候,使用的Rust版本是stable,vscode插件是Rust(rls)。一直以来工作良好,除了有时候rls会hanging。 最近要使用nightly版本的rust,vscode提示没有rls,然后选择安装,发现安装失败。于是就鼓捣了一番,决定将过程记录下来。 nightly版本,顾名思义就是每晚构建的开发版本了。我以前安装nightly时的命令是 rustup toolchain install nightly 这个命令呢会安装最新构建的nightly版本。 rustup update 这个命令呢会更新安装的所有toolchain至最新。但是最新构建的nightly版本,有可能还没有与之对应的rls组件,这样的话在IDE里就没法好好开发了,毕竟在rust里,编译器是 程序员的爹。没有rls,就会像失去了眼睛一样难受。搜寻了一番,找到一个地址,通过网页可以快捷的知道对于平台的nightly版本,其对于组件的发布情况如何。如果你们以后发现 自己的rust没有对于的rls,就可以检查下是不是nightly太新了,如果是的话,就需要安装前几个版本的nightly了。 https://rust-lang.github.io/rustup-components-history/x86_64-apple-darwin.html 如何安装指定版本的nightly呢 ... read more
Fri 06 September 2019

Rust反序列JSON的小技巧

serde是Rust中最流行的序列化和反序列化crate,这一篇就来记录下如何使用serde_json来反序列化连续的json对象。 比如有这样一段json数据: {"start_pos": 0, "end_pos": 10}{"start_pos": 10, "end_pos": 30} {"start_pos": 30, "end_pos": 40} 这段数据中,是三个连续的字段相同json对象,那么如何对这多个数据进行反序列化呢? use serde::{Deserialize, Serialize}; use serde_json::Deserializer; #[derive(Deserialize, Debug)] struct Index { start_pos: u32, end_pos: u32, } fn main() { let data = r#" {"start_pos": 0, "end_pos": 10}{"start_pos": 10, "end_pos": 30} {"start_pos": 30, "end_pos ... read more
Thu 05 September 2019

Rust的macro小记(一)

这篇记录一下Rust中的Function-like macros,也就是形如println!(...)形式的宏。 先来一个简单的 macro_rules! hello { () => { println!("Hello, World!"); } } fn main() { hello!(); } 上面这个简单的例子中, 定义了一个叫做hello的宏,匹配规则为空。作用就是在使用该宏的地方,插入代码println!("Hello, World!");。 接下来我们加入匹配规则,来让这个宏更加的灵活. macro_rules! hello { () => { println!("Hello, World!"); }; ($name:expr) => { println!("Hello, {}!", $name); } } fn main() { hello!(); hello!("rust"); } 现在增加了一个匹配规则,这样编译器在在工作时会按规则匹配,使用不同的代码分支。那可不可以让hello支持多个参数呢? 当然可以!宏的匹配规则支持重复模式! * 模式重复零次或多次 + 模式重复一次或多次 ? 模式出现零次或一次 让我们来稍加改造一下 ... read more
Wed 04 September 2019

Rust使用match的小发现

今天在读一个库的代码时候,发现了之前使用match的时候没有注意的一个地方。 enum Foo { One, Two, Three, } fn main () { let foo = Foo::One; match foo { Foo::One => println!("It's one"), others => println!("It's others"), }; } 这里没有使用_去匹配其他分支,而是随意指定了一个名字others。貌似对可读性有一定提升。 read more
 

Tags