Rust中的RefCell和内部可变性】的更多相关文章

RefCell Rust在编译阶段会进行严格的借用规则检查,规则如下: 在任意给定时间,要么只能有一个可变引用,要么只能有多个不可变引用. 引用必须总是有效. 即在编译阶段,当有一个不可变值时,不能可变的借用它.如下代码所示: fn main() { let x = 5; let y = &mut x; } 会产生编译错误: error[E0596]: cannot borrow immutable local variable `x` as mutable --> src/main.rs:…
原文标题: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…
原文链接: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),…
原文标题:Understanding Closures in Rust 原文链接:https://medium.com/swlh/understanding-closures-in-rust-21f286ed1759 公众号: Rust 碎碎念 翻译 by: Praying 概要 闭包(closure)是函数指针(function pointer)和上下文(context)的组合. 没有上下文的闭包就是一个函数指针. 带有不可变上下文(immutable context)的闭包属于Fn 带有可变…
原文标题: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 中,它…
在学习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; | ^…
这个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_…
我为什么学Rust? 2019年6月18日,Facebook发布了数字货币Libra的技术白皮书,我也第一时间体验了一下它的智能合约编程语言MOVE,发现这个MOVE是用Rust编写的,看来想准确理解MOVE的机制,还需要对Rust有深刻的理解,所以又开始了Rust的快速入门学习. 欧拉计划 看了一下网上有关Rust的介绍,都说它的学习曲线相当陡峭,曾一度被其吓着,后来发现Rust借鉴了Haskell等函数式编程语言的优点,而我以前专门学习过Haskell,经过一段时间的入门学习,我现在已经喜欢…
泛型基类中引用Api函数定义时static extern,在子类中会提示: 未处理TypeLoadException 泛型方法或泛型类中的方法是内部调用.PInvoke 或是在 COM 导入类中定义的. 解决方法:将定义Api函数封装到独立的类中即可 public class GenericClass1<T> { [System.Runtime.InteropServices.DllImport("user32.dll")] public static extern sho…
原文标题:Understanding Partial Moves in Rust 原文链接:https://whileydave.com/2020/11/30/understanding-partial-moves-in-rust/ 公众号: Rust 碎碎念 翻译 by: Praying 最近,我一直在研究Rust,虽然从很多方面来看它都是一门十分优秀的语言,但我也发现了很多不易察觉的复杂性.其中一个例子就是,不太引人注意的局部移动(partial move) .因此,我在想,为什么不写一篇文…
虽然已经是阳春三月,但骑着共享单车骑了这么远,还有有点冷的.我搓了搓的被冻的麻木的手,对着前台的小姐姐说:"您好,我是来面试的."小姐姐问:"您好,您叫什么名字?"我回答:"我叫万猫学社."小姐姐笑出了声,说到:"这名字好怪,谁给你起的啊."我面无表情地回答:"俺爹."小姐姐收起了笑容,说到:"跟我来吧."我被带到了面试间等候,片刻后一个着干净满脸清秀的青年走了进来,一股男士香水的淡香扑…
非正常大小的类型 大多数的时候,我们期望类型在编译时能够有一个静态已知的非零大小,但这并不总是 Rust 的常态. Dynamically Sized Types (DSTs) Rust 支持动态大小的类型(DST):这些类型没有静态(编译时)已知的大小或者布局.从表面上看这有点离谱:Rust 必须知道一个东西的大小和布局,才能正确地进行处理.从这个角度上看,DST 不是一个普通的类型,因为它们没有编译时静态可知的大小,它们只能存在于一个指针之后.任何指向 DST 的指针都会变成一个包含了完善…
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:如果你已经了解这部分内…
原文标题: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…
要实现如图一所示的结果: html代码如下: <!DOCTYPE html> <html> <head lang="zh"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="utf-8" /> <title>商品管理后台首页</title> <lin…
安装完 VisualStudio 2010编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示“csc不是内部或外部命令,也不是可运行的程序,或批处理文件”.这时只需配置好环境变量,就可以成功执行csc命令编译C#源码了.…
我先把主要过程叙述一下,叙述完有每个问题的具体操作方法. 今天我在XP上安装IIS,运行网站出现"HTTP 500 - 内部服务器错误". 打开HTML没有问题,打开ASP文件时就出现"HTTP 500 - 内部服务器错误",网站程序本身是绝对没有问题的. 查阅了N多资料,网上总结的说就几种情况:IIS有问题,iis帐号同步问题,ntfs访问权限问题 IIS我得装了几遍,还是不行,iis帐号同步.ntfs访问权限的等这些方法也都是试了,还是没搞定, 最后不得不重装系…
我们先来假设这种场景: 一个学校中有多个年级,一个年级有多个班级,一个班级里有多个学生.这里我们只需要班级.年级.和学生这三个概念: 让我们先来定义Class类和Student类: // 注意,Class是班级而不是 教室的意思,教室是 Classroom. public class Class { public int ClassId { get; set; } // 同一个班级的学生必然是属于同一个年级的,故GradeId直接在Class中声明就可以了. public int GradeId…
安装完 VisualStudio 编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示"csc不是内部或外部命令,也不是可运行的程序,或批处理文件".这时只需配置好环境变量,就可以成功执行csc命令编译C#源码了.使用记事本编写一个C#程序,保存后将扩展名改为cs,存储在D盘中.这个文件会成为本例中的一个样本.代码大意为向命令行中写下"Hello World". 1.在.NET Fr…
问题描述 最近在使用Spring Cloud改造现有服务的工作中,在内部服务的调用方式上选择了Feign组件,由于服务与服务之间有权限控制,发现通过Feign来进行调用时如果发生了401.407错误时,调用方不能够取回被调用方返回的错误信息. 产生原因 Feign默认使用java.net.HttpURLConnection进行通信,通过查看其子类sun.net.www.protocol.http.HttpURLConnection源码发现代码中在进行通信时单独对错误码为401\407的错误请求做…
如果你的 Confluence 站点当前使用的是 Crowd 或者 Jira 应用程序管理你的用的话,你可以按照下面的步骤切换使用回内部目录管理你的用户. 如果你的 Confluence 站点只有少量的用户的话,在 Confluence 中手动重建用户和用户组就比较简单.如果你有很多的用户的话,整合用户和用户组到 Confluence 内部目录中就会比较简单有效. 下面的两个选项都会重置用户的密码.当下面的2 个选项完成操作的时候,请提醒你的用户使用重置我的密码(Reset My Passwor…
转自: http://www.kongqingquan.com/archives/208#more-208 Erlang中的atom由通用hash表实现,虚拟机中atom最终的用数值表示,对应表中的下标值.本文通过list_to_atom函数的实现,分析atom在虚拟机中的内部实现.先看atom的数据结构: $OTP/erts/emulator/beam/atom.h typedef struct atom { IndexSlot slot; /* 必须放到结构体顶部,通用hash表时用到!!!…
原文标题: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)集合都…
面试官:Redis中基本的数据类型有哪些? 我:Redis的基本数据类型有:字符串(string).哈希(hash).列表(list).集合(set).有序集合(zset). 面试官:有序集合的内部实现方式是什么? 我还沉浸在上一个问题的沾沾自喜中,顿时表情凝固了,手心开始冒出冷汗."这个..没有太深入了解",我支支吾吾的说到. 面试官:回去等消息吧. 这句话说的干净利落,然后就没有然后了.失败是成功的妈妈,我不气馁,决定马上恶补一下. 有序集合的内部实现 有序集合的内部实现有两种,分…
HashSet 的内部采用 HashMap 来实现.由于 Map 需要 key 和 value,所以 所有 key 的都有一个默认 value.类似于 HashMap,HashSet 不允许重复的 key,只允许有一个 null key,意思就是 HashSet 中只允许存储一个 null 对象.…