Rust中的Slices】的更多相关文章

这个slice切片,python中有,go中有, 但确实,Rust中最严格. 精彩见如下URL: Rust 程序设计语言(第二版) 简体中文版 · GitBook (Legacy) https://kaisery.gitbooks.io/trpl-zh-cn/content/ch04-03-slices.html fn main() { let my_string = String::from("hello world"); let word = first_word(&my_…
原文链接:https://hashrust.com/blog/arrays-vectors-and-slices-in-rust/ 原文标题:Arrays, vectors and slices in Rust 公众号:Rust 碎碎念 翻译: Praying 引言(Introduction) 在本文中,我将会介绍 Rust 中的 array.vector 和 slice.有 C 和 C++编程经验的程序员应该已经熟悉 array 和 vector,但因 Rust 致力于安全性(safety),…
非正常大小的类型 大多数的时候,我们期望类型在编译时能够有一个静态已知的非零大小,但这并不总是 Rust 的常态. Dynamically Sized Types (DSTs) Rust 支持动态大小的类型(DST):这些类型没有静态(编译时)已知的大小或者布局.从表面上看这有点离谱:Rust 必须知道一个东西的大小和布局,才能正确地进行处理.从这个角度上看,DST 不是一个普通的类型,因为它们没有编译时静态可知的大小,它们只能存在于一个指针之后.任何指向 DST 的指针都会变成一个包含了完善…
在学习Rust过程中突然想到怎么实现继承,特别是用于代码复用的继承,于是在网上查了查,发现不是那么简单的. C++的继承 首先看看c++中是如何做的. 例如要做一个场景结点的Node类和一个Sprite类继承它. 定义一个node基类 struct Node { float x; float y; void move_to(float x, float y) { this->x = x; this->y = y; } virtual void draw() const { printf(&qu…
1. as 运算符 as 运算符有点像 C 中的强制类型转换,区别在于,它只能用于原始类型(i32 .i64 .f32 . f64 . u8 . u32 . char 等类型),并且它是安全的. 例 在 Rust 中,不同的数值类型是不能进行隐式转换的,比如: let b: i64 = 1i32; 会出现编译错误,提示无法进行类型转换. error[E0308]: mismatched types --> src\main.rs:2:18 | 2 | let b: i64 = 1i32; | ^…
RefCell Rust在编译阶段会进行严格的借用规则检查,规则如下: 在任意给定时间,要么只能有一个可变引用,要么只能有多个不可变引用. 引用必须总是有效. 即在编译阶段,当有一个不可变值时,不能可变的借用它.如下代码所示: fn main() { let x = 5; let y = &mut x; } 会产生编译错误: error[E0596]: cannot borrow immutable local variable `x` as mutable --> src/main.rs:…
我为什么学Rust? 2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个MOVE是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以又开始了Rust的快速入门学习. 欧拉计划 看了一下网上有关Rust的介绍,都说它的学习曲线相当陡峭,曾一度被其吓着,后来发现Rust借鉴了Haskell等函数式编程语言的优点,而我以前专门学习过Haskell,经过一段时间的入门学习,我现在已经喜欢…
原文标题:Understanding Closures in Rust 原文链接:https://medium.com/swlh/understanding-closures-in-rust-21f286ed1759 公众号: Rust 碎碎念 翻译 by: Praying 概要 闭包(closure)是函数指针(function pointer)和上下文(context)的组合. 没有上下文的闭包就是一个函数指针. 带有不可变上下文(immutable context)的闭包属于Fn 带有可变…
原文标题:Understanding Partial Moves in Rust 原文链接:https://whileydave.com/2020/11/30/understanding-partial-moves-in-rust/ 公众号: Rust 碎碎念 翻译 by: Praying 最近,我一直在研究Rust,虽然从很多方面来看它都是一门十分优秀的语言,但我也发现了很多不易察觉的复杂性.其中一个例子就是,不太引人注意的局部移动(partial move) .因此,我在想,为什么不写一篇文…
原文标题:Understanding Futures In Rust -- Part 1 原文链接:https://www.viget.com/articles/understanding-futures-in-rust-part-1/ 公众号: Rust 碎碎念 翻译 by: Praying 背景 Rust 中的 Futures 类似于 Javascript 中的promise[1],它们是对 Rust 中并发原语的强大抽象.这也是通往async/await[2]的基石,async/await…
原文标题:Understanding Futures in Rust -- Part 2 原文链接:https://www.viget.com/articles/understanding-futures-is-rust-part-2/ 公众号: Rust 碎碎念 翻译 by: Praying 背景 如果你还没有看前面的内容,可以在这里[1]查看(译注:已有译文,可在公众号查看). 在第一部分,我们介绍了 Future trait,了解了 future 是如何被创建和运行的,并且开始知道它们如何…
原文标题:Understanding Rust Lifetimes 原文链接:https://medium.com/nearprotocol/understanding-rust-lifetimes-e813bcd405fa 公众号: Rust 碎碎念 翻译 by: Praying 从 C++来到 Rust 并需要学习生命周期,非常类似于从 Java 来到 C++并需要学习指针.起初,它看起来是一个不必要的概念,是编译器应该处理好的东西.后来,当你意识到它赋予你更多的力量--在 Rust 中,它…
repr(Rust) 首先,所有类型都有一个以字节为单位的对齐方式,一个类型的对齐方式指定了哪些地址可以用来存储该值.一个具有对齐方式n的值只能存储在n的倍数的地址上.所以对齐方式 2 意味着你必须存储在一个偶数地址,而 1 意味着你可以存储在任何地方.对齐至少是 1,而且总是 2 的幂. 基础类型通常按照其大小对齐,尽管这是特定平台的行为.例如,在 x86 上u64和f64通常被对齐到 4 字节(32 位). 一个类型的大小必须始终是其对齐方式的倍数(零是任何对齐方式的有效大小),这就保证了该…
这个看起来是一个很小的问题,我们如果是在.NET里面的话,很简单地可以直接使用System.DateTime.Now获取到当前时间,还可以进行各种不同的计算或者输出.但是这样一个问题,在rust里面,还是费了我一些时间的.当然,我觉得这种折腾也是有些益处的,从中可以更好地理解rust的一些内部原理. 首先来看一下怎么做吧 rust默认自带的std库,里面并没有针对时间的功能,如果我们要处理时间(获取当前时间,或者计算两个时间的间隔等等)的话,需要引入一个额外的库,名称就叫time http://…
原文标题:How Arc works in Rust 原文链接:https://medium.com/@DylanKerler1/how-arc-works-in-rust-b06192acd0a6 公众号: Rust 碎碎念 翻译 by: Praying 原子引用计数(Arc)类型是一种智能指针,它能够让你以线程安全的方式在线程间共享不可变数据.我还没有发现能够很好地解释它的工作原理的文章,所以我决定尝试来写一篇.(文章)第一部分是介绍怎样使用Arc和为什么要使用Arc:如果你已经了解这部分内…
原文标题:Why doesn't Rust's BTreeMap have a with_capacity() method? 原文链接:https://www.nicolas-hahn.com/2020/11/30/btreemap-with-capacity/ 公众号: Rust 碎碎念 翻译 by: Praying 声明:我发现这里已经有一篇解释,但是我认为它有点不太好理解,所以我希望我写的这篇文章能够更容易理解一些. Rust 的 HashMap(以及 HashSet 和 Vec)集合都…
原文标题:Study of std::io::Error 原文链接:https://matklad.github.io/2020/10/15/study-of-std-io-error.html 公众号: Rust 碎碎念 翻译 by: Praying 在本文中,我们将剖析 Rust 标准库中的std::io::Error类型的实现.对应的代码在:library/std/src/io/error.rs[1]. 你可以把把本文作为: 对标准库某一部分的研究 一份高级错误管理指南 一个美观的 API…
Rust 允许你指定不同于默认的数据布局策略,并为你提供了不安全代码指南. repr(C) 这是最重要的"repr".它的意图相当简单:做 C 所做的事.字段的顺序.大小和对齐方式与你在 C 或 C++ 中期望的完全一样.任何你期望通过 FFI 边界的类型都应该有repr(C),因为 C 是编程世界的语言框架.这对于合理地使用数据布局做更多的技巧也是必要的,比如将值重新解释为不同的类型. 我们强烈建议使用rust-bindgen和/或cbindgen来为你管理 FFI 的边界.Rust…
cargo是Rust内置的项目管理工具.用于Rust 项目的创建.编译.执行,同一时候对项目的依赖进行管理,自己主动推断使用的第三方依赖库,进行下载和版本号升级. 一.查看 cargo 版本号 安装Rust之后,能够使用 cargo --version 查看cargo的版本号信息. $ cargo --version cargo 0.8.0-nightly (28a0cbb 2016-01-17) 二.创建新项目 1.使用 " new 项目名称" 创建新项目 cargo new hel…
大部分情况下所有权是非常明确的:可以准确的知道哪个变量拥有某个值.然而,有些情况单个值可能会有多个所有者.例如,在图数据结构中,多个边可能指向相同的结点,而这个结点从概念上讲为所有指向它的边所拥有.结点直到没有任何边指向它之前都不应该被清理. 为了启用多所有权,Rust 有一个叫做 Rc<T> 的类型.其名称为 引用计数(reference counting)的缩写.引用计数意味着记录一个值引用的数量来知晓这个值是否仍在被使用.如果某个值有零个引用,就代表没有任何有效引用并可以被清理. enu…
类似接口,但和php中的trait又有点不一样. pub trait Summary { fn summarize(&self) -> String; } pub struct NewArticle { pub headline: String, pub author: String, } pub struct Tweet { pub username: String, pub content: String, pub reply: bool, pub retweet: bool, } im…
go没有的,rust有呢~~ fn largest<T: PartialOrd + Copy>(list: &[T]) -> T { let mut largest = list[]; for &item in list.iter() { if item > largest { largest = item; } } largest } fn main() { let number_list = vec![, , , , ]; let result = larges…
一路看过来,怕是我知道的所有语言当,处理最复杂吧. 当然,如果能正确处理,也是能理解最到位的. 这,就是我为什么要学Rust的原因. 暂无用武之地,但逻辑体系和知识点够复杂,才能应对更多事务~ fn main() { let s1 = String::from("tic"); let s2 = String::from("tac"); let s3 = String::from("toe"); let s = format!("{}-{…
常用类型操作, 如python中的list,turple,dictory等, 更方常编程常用数据的处理. fn main() { let v = vec![, , , , ]; let third: &i32 = &v[]; println!("The third element is {}", third); match v.) { Some(third) => println!("The element is {}", third), No…
注意区别语句和表达式哟. Rust是一门基于表示式的语言,牢记!!! fn main() { println!("Hello world!"); another_function(5, 6); let y = { let x = 3; x + 1 }; println!("The value of y is: {}", y); let x = plus_one(5); println!("The value of x is: {}", x); }…
理解Rust的引用与借用(好文链接) #![feature(core_intrinsics)] fn print_type_of<T>(_: T) { println!("{}", unsafe { std::intrinsics::type_name::<T>() }); } fn main() { let ref a: i32; a = &1; let ref a: i32 = 1; print_type_of(a); let c: &u32…
一个编程语言依赖包管理的普通问题. cargo解决得比较优雅. 一,新建$HOME/.cargo/config文件 [source.crates-io] registry = "https://github.com/rust-lang/crates.io-index" replace-with = 'ustc' [source.ustc] registry = "git://mirrors.ustc.edu.cn/crates.io-index" 二,项目cargo…
主要是了解unsafe{}语法块的作用. #[repr(C)] #[derive(Copy, Clone)] #[derive(Debug)] struct Complex { re: f32, im: f32, } #[link(name = "m")] extern { fn ctanf(z: Complex) -> Complex; } fn tan(z: Complex) -> Complex { unsafe { ctanf(z) } } fn main() {…
这是为了开发大型程序,分治crate用的. 目录结构如下: 一,根cargo.toml内容 [workspace] members = [ "adder", "add-one", ] 二,adder里的cargo.toml内容 [package] name = "adder" version = "0.1.0" authors = ["test <test@qq.com>"] edition =…
和闭包一样,练代码 struct Counter { count: u32, } impl Counter { fn new() -> Counter { Counter {count: } } } impl Iterator for Counter { type Item = u32; fn next(&mut self) -> Option<Self::Item> { self.count += ; { Some(self.count) } else { None }…