- tags: Programming Language
Rust
Links to this note
Rust std::borrow::Cow
ref: Rust, Rust Borrow and Lifetimes 发现一个 Cow 用处,可以让变量支持同时赋值引用类型和值类型,场景就是我们可能接收到一个引用,同时可能需要把它变成值类型做一些处理,我们可以通过 clone 或 to_owned 统一变成值类型: fn maybe_need_to_change(s: &str) { let s = if s.starts_with("xxx") { manipulate(s) } else { s.to_owned() // 存在额外的开销 }; take_reference(&s); // s.into_owned() 可以得到 String 类型的值 } fn manipulate(s: &str) -> String { s.to_owned() } fn take_reference(s: &str) { } 另外一种方式就是通过 Cow 避免不必要的 clone 开销: fn maybe_need_to_change(s: &str) { let s = if s.starts_with("xxx") { Cow::from(manipulate(s)) } else { Cow::from(s) // 没有额外的开销 }; take_reference(&s); } fn manipulate(s: &str) -> String { s....
Rust Opaque Types: Static Dispatch vs. Dynamic Dispatch
tags: Rust source: Johnston, Dylan R. “Formally Verifying Rust’s Opaque Types,” August 1, 2022. https://dylanj.xyz/posts/rust-coq-opaque-types/. Prelude trait ToString { fn to_string(&self) -> String; } Static Dispatch fn yell<S: ToString>(stringable: S) { println!(stringable.to_string().to_uppercase()) } Dynamic Dispatch fn yell(stringable: &dyn ToString) { println!(stringable.to_string().to_uppercase()) } impl Trait fn yell(stringable: impl ToString) { println!(stringable.to_string().to_uppercase()) }
Flutter FFI didn't be Invoked in Release Mode
tags: Rust,Flutter,iOS source: “Using Dummy Headers - Flutter_rust_bridge.” Accessed July 25, 2022. http://cjycode.com/flutter_rust_bridge/integrate/ios_headers.html. Recently, I met a problem that the iOS app didn’t work properly in release mode. After a little searching, I found it’s a Flutter app and invoked a Rust function by FFI. The inital call were not invoked during app startup, and it should be. I finally resolved the problem by following: https://github.com/fzyzcjy/flutter_rust_bridge/issues/496 http://cjycode.com/flutter_rust_bridge/integrate/ios_headers.html In short:...
GitHub: linebender/druid – A data-first Rust-native UI design toolkit.
tags: Rust,Rust GUI Overview Platform Documentation Community Activity Most Activity Period Native UI Cross platform Leak 5.7k stars Yes 2019-2021 No Conclusion Use the the platform-native widgets or mimic them. (Relm, SixtyFPS) Embed easily into custom render pipelines. (Conrod) Adhere to a specific architectural style such as Elm. (Iced, Relm) Support rendering to HTML when targeting the web. (Iced, Moxie)
GitHub: redox-os/orbtk – The Rust UI-Toolkit.
tags: Rust,Rust GUI Overview Platform Documentation Community Activity Most Activity Period Native UI Cross platform Leak 3.5k stars Kind of 2020 No Conclusion Highlights – Cross platform Downsides – Documentation leak and not in activity development.
Rust GUI
tags: Rust,GUI
Why Rust strings seem hard
tags: Rust “Why Rust Strings Seem Hard | Brandon’s Website.” Accessed January 17, 2022. https://www.brandons.me/blog/why-rust-strings-seem-hard.
如何理解 Sync 和 Send?
tags: Rust,Thread Safety source: Hexi. “如何理解 Sync 和 Send?” 李晨曦的博客 | Hexi Blog, May 5, 2019. https://hexilee.me/2019/05/05/how-to-understand-sync-and-send-in-rust/. 语义: 实现了 Send 的类型,可以安全地在线程间传递所有权。也就是说, 可以跨线程移动。 实现了 Sync 的类型, 可以安全地在线程间传递不可变借用。也就是说,可以跨线程共享。
The Little Book of Rust Macros
tags: Rust,Rust Macro,Online Tutorial source: https://danielkeep.github.io/tlborm/book/index.html
A half-hour to learn Rust
tags: Rust,Online Tutorial source: fasterthanli.me. “A Half-Hour to Learn Rust.” Accessed January 17, 2022. https://fasterthanli.me/articles/a-half-hour-to-learn-rust.
Rust Macro
tags: Rust
GitHub: dtolnay/proc-macro-workshop - Learn to write Rust procedural macros
tags: Rust,Rust Macro,Learning
GitHub: pingcap/talent-plan - open source training courses about distributed database and distributed systemes
tags: Rust,Distributed Systems,Online Tutorial,Learning source: https://github.com/pingcap/talent-plan
GitHub: rust-lang/rustlings – Small exercises to get you used to reading and writing Rust code!
tags: Rust,Online Tutorial,Learning source: https://github.com/rust-lang/rustlings
Rust Language Cheat Sheet
tags: Rust,Online Tutorial source: https://cheats.rs/
Deserializing JSON really fast
tags: Rust,优化,High Performance source: https://blog.datalust.co/deserializing-json-really-fast/
SO: What is the difference between iter and into_iter?
tags: Rust source: https://stackoverflow.com/a/34745885/2873718
GitHub: Rust Memory Container Cheat-sheet
tags: Rust Wrapper Types,Rust source: Rust Memory Container Cheat-sheet
Wrapper Types in Rust: Choosing Your Guarantees
tags: Rust,Rust Wrapper Types source: https://manishearth.github.io/blog/2015/05/27/wrapper-types-in-rust-choosing-your-guarantees/
GitHub: raft-rs
tags: Rust,Raft source: https://github.com/tikv/raft-rs
actix-web extractors 支持提取任意长度的参数
tags: Rust 背景 今天看了一下 actix-web 发现该框架支持基于参数的 Extractor,可以非常方便地解析参数(包括 URI、Query、JSON 和 FormData)。 先来看一个在项目 README.md 中的例子: use actix_web::{get, web, App, HttpServer, Responder}; #[get("/{id}/{name}/index.html")] async fn index(web::Path((id, name)): web::Path<(u32, String)>) -> impl Responder { format!("Hello {}! id:{}", name, id) } #[actix_web::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| App::new().service(index)) .bind("127.0.0.1:8080")? .run() .await } 初看之下觉得很神奇,但细想通过宏实现应该不是特别困难,然后发现其官网还有不是基于宏的运行时调用: use actix_web::{web, App, HttpRequest, HttpServer, Responder}; async fn greet(req: HttpRequest) -> impl Responder { let name = req.match_info().get("name").unwrap_or("World"); format!("Hello {}!...
When Zero Cost Abstractions Aren't Zero Cost
tags: Rust 原文:When Zero Cost Abstractions Aren’t Zero Cost
Tokio
tags: Rust
Understanding Rust futures by going way too deep
tags: Translate,Rust,Tokio 原文链接:Understanding Rust futures by going way too deep。 译者注:原文大量的引入了有趣的对话,迫于排版问题这里不进行翻译,必要的对话通过引用块来解释。 深入理解 Rust future 用 Rust future!就是这么简单!直到我们发现并非如此。所以我们先探索简单的部分,然后继续探索困难部分而不是等它慢慢靠近我们。 起步 Choo choo here comes the easy part 🚂💨 我们创建一个新的项目: $ cargo new waytoodeep Created binary (application) `waytoodeep` package 我们需要安装 cargo-edit 如果之前没有安装过的话,接下来就可以直接 cargo add : $ cargo install cargo-edit Updating crates.io index Downloaded cargo-edit v0.7.0 Downloaded 1 crate (57.6 KB) in 0.47s Ignored package `cargo-edit v0.7.0` is already installed, use --force to override 因为 cargo-edit 很方便,所以你可能已经安装过它。部分读者会感到困惑是因为像 cargo new, cargo build, cargo test, cargo run 等子命令都内置在 cargo 中, 但是 cargo add 没有。...
C、Rust 和 Swift 的内存模型
tags: Rust,Swift,编程语言内存模型 都采用C++11 内存模型。
Rust Obscure Words for non-native English speakers
tags: Rust,Learning English unwinding
Rust Asynchronous Programming
tags: Rust Future async fn 将一个代码块转换为一个 Future 对象, Future 对象维护一个状态机 Future 对象必须运行在一个 Executor 上 Executor futures::executor::block_on 阻塞当前线程直到 future 完成 // `block_on` blocks the current thread until the provided future has run to // completion. Other executors provide more complex behavior, like scheduling // multiple futures onto the same thread. use futures::executor::block_on; async fn hello_world() { println!("hello, world!"); } fn main() { let future = hello_world(); // Nothing is printed block_on(future); // `future` is run and "hello, world!...
Choosing a Rust web framework, 2020 edition
tags: Rust source: Choosing a Rust web framework, 2020 edition
Fearless Concurrency with Rust
tags: Rust 原文链接:https://blog.rust-lang.org/2015/04/10/Fearless-Concurrency.html
Rust Means Never Having to Close a Socket
tags: Translate,Rust,Rust Wrapper Types 原文链接:Rust Means Never Having to Close a Socket Rust 最酷的特性之一就是它可以自动地帮助你管理资源,同时在仍能保持安全(没有段错误)和高性能。 这是因为 Rust 是一门与众不同地编程语言,要理解我说的可能有点困难,让我来更近一步说明: Rust 就像带垃圾回收的编程语言,你无需手动释放内存 Rust 不同于其他带垃圾回收的编程语言,你无需1手动关闭或者释放像文件、套接字和锁这样的资源 Rust 达到以上这些特性不附带任何运行时开销(垃圾回收或者引用计数),并且不牺牲安全性。 如果你曾经造成过一个套接字或者文件泄漏,或者使用过一些抽象方法造成了这些资源的泄漏,那么你就会知道这有多重要。 你可能已经期望通过“使用后释放”来避免内存问题,而与此同时你并没有考虑到没有明确地关闭套接字可能出现类似的错误。我在这里告诉你,还有更好地办法。 如果你使用的是带垃圾回收的编程语言,则应密切关注本文提到的资源管理方面的内容。如果你使用的是像 C/C++ 这样底层编程语言,你可能会对安全方面更加感兴趣。 Rust 的许多特性都是从其他语言借鉴而来。Rust 之所以变得有趣是因为它把所有的这些特性放在了一起,并且在编程语言层面实现了更严格地保证。 实际上,这种编程语言层面的保证让这些特性更加实用。 所有权系统(The Ownership System) 让这种保证工作的方式是通过 Rust 的「所有权(ownership)」系统。不管任何时候你创建一个新的对象,都被创建它的「作用域(scope)」所拥有。 让我们通过一个例子来进一步说明:我们定义一个函数,函数拷贝输入文件到临时文件去处理它,然后拷贝输入文件到输出文件。 fn process(from: &Path, to: &Path) -> IoResult<()> { // creates a new tempdir with the specified suffix let tempdir = try!(TempDir::new("skylight")); // open the input file let mut from_file = try!...
Rust Trait Object
tags: Rust 动态大小类型(DST)和 Sized 特性 str (非 &str )就是一个 DST,我们不能在运行时得知 str 的大小。 &str 是一个指针类型,大小是已知的。 DST:拥有额外的元数据存储动态大小的信息。 每一个特性都是一个是个 DST,使用 Trait Object 必须是像 &dyn Trait 和 Box<dyn Trait> (或 Rc<dyn Trait> )的指针类型。 dyn 关键字 dyn 关键字用于将 Trait Object 指针和普通的结构体指针区分开来。 Sized vs ?Sized Rust 有一个特定的特性叫做 Sized 去判断一个类型的大小是否是编译期可知的,并且自动在编译期为所有已知大小的类型实现, 同时 Rust 隐式的为泛型函数的类型参数加上 Sized 的限制(bound),下面这样的泛型函数: fn generic<T>(t: T) { // --snip-- } 实际上相当于像下面这样硬编码: fn generic<T: Sized>(t: T) { // --snip-- } 也可以通过下面特定的语法取消这个限制: fn geneic<T: ?Sized>(t: &T) { // --snip-- }
Rust Borrow and Lifetimes
tags: Rust,Translate,Rust Wrapper Types 原文链接:Rust Borrow and Lifetimes。 Rust 是一门处于往 1.0 活跃开发的新语言(译注:1.0 早已发布,目前最新稳定版本 1.42)。 我必须再写一篇关于我为什么觉得 Rust 牛逼的新博客,但是今天我将关注在它的借用(borrow) 和生命周期(lifetimes)系统,这也是常常让包括我在内的 Rust 新手陷入困境的地方。这篇文章假设 你基本了解 Rust,如果还没推荐你先阅读指南和指针指南。 资源所有权和借用 Rust 通过一个难缠的(sophisticated)借用系统在不用 GC 的情况下达到内存安全。对于任何资源 (栈内存、堆内存、文件句柄等),他们都对应一个唯一的所有者(owner)在需要的情况下处理资源回收。 你可以通过 & 或者 &mut 创建一个新的绑定指向该资源,这被称之为借用或可变借用。编译器确保 所有的所有者(owners)和借用者(borrowers)行为正确。 拷贝和转移(Copy and move) 在我们开始进入借用系统之前,我们需要知道 Rust 如何处理拷贝和转移。这个 StackOverflow 答案非常值得一读。 基本上,在赋值和函数调用上: 如果值是可拷贝的(copyable)(仅涉及原始(primitive)类型,不涉及如内存或文件句柄的资源),编译器默认进行拷贝。 其他情况,编译器转移(moves)所有权(ownership)并使原来的绑定无效。 简而言之,POD(Plan Old Data) => 拷贝,Non-POD(线性类型(linear types))=> 转移。 以下是一些额外的注释供你参考: Rust 拷贝像 C。每一个按值(by-value)使用一个值都是字节拷贝(通过 memcpy 浅拷贝),而不是语义上的拷贝或克隆。 如果想要让一个 POD 结构体变成不可拷贝的,你可以使用一个 NoCopy 标记,或者实现 Drop 特性(trait)。 转移之后,所有权就转移到了下一个所有者那。 资源回收 Rust 会在任何资源的所有权消失后立刻释放该资源,就这些,当:...
Rust Wrapper Types
tags: Rust
《The Rust Programming Language》读书笔记
tags: 读书笔记,Rust 语句和表达式 所有权 引用和借用 结构体 枚举 模式匹配 if let 模块化 错误处理 Traits 生命周期 闭包 迭代器 智能指针 Rust 宏 Rust 并发 函数指针 fn 区分闭包的 Fn 特性,函数指针都实现来三个闭包的特性。 fn do(f: fn(i32) -> i32, arg: i32) -> i32 { f(arg) + f(arg) }