popusk - 一个终端下的电子书管理器
https://github.com/davudMagomedov/popusk
Nutype - 给你的newtype类型加上自定义错误处理
use nutype::nutype;
// Define a newtype `Name` with custom validation logic and a custom error type `NameError`.
// If validation fails, `Name` cannot be instantiated.
#[nutype(
validate(with = validate_name, error = NameError),
derive(Debug, AsRef, PartialEq),
)]
struct Name(String);
// Custom error type for `Name` validation.
// You can use `thiserror` or similar crates to provide more detailed error messages.
#[derive(Debug, PartialEq)]
enum NameError {
TooShort { min: usize, length: usize },
TooLong { max: usize, length: usize },
}
// Validation function for `Name` that checks its length.
fn validate_name(name: &str) -> Result<(), NameError> {
const MIN: usize = 3;
const MAX: usize = 10;
let length = name.encode_utf16().count();
if length < MIN {
Err(NameError::TooShort { min: MIN, length })
} else if length > MAX {
Err(NameError::TooLong { max: MAX, length })
} else {
Ok(())
}
}
fn main() {
// Example usage: attempt to create a `Name` instance with an invalid value.
assert_eq!(Name::try_new("Fo"), Err(NameError::TooShort { min: 3, length: 2 }));
}
https://github.com/greyblake/nutype
我们是否需要被封印(sealed)的trait
-
文章讨论了Rust中向trait添加新项目是否会破坏语义化版本(SemVer)的问题。
-
关键在于判断trait是否为"sealed"(封闭的)。如果trait是sealed,则下游crate无法实现它,因此添加新项目不会造成破坏性更改。
-
判断trait是否sealed涉及多个复杂因素:
- 新添加的项目是否有默认实现
- trait的函数签名是否使用了私有类型
- trait本身是否可以被命名
- trait的supertrait是否sealed
- 是否存在blanket实现(泛型实现)
-
手动判断一个trait是否sealed非常耗时且容易出错。
-
cargo-semver-checks工具(v0.35版本)能够自动、快速、准确地进行这种判断,大大简化了开发者的工作。
-
作者呼吁更多人使用和支持cargo-semver-checks,以改善Rust生态系统的SemVer合规性。
这篇文章强调了在Rust开发中自动化工具的重要性,特别是在处理复杂的语言特性和版本控制规则时。
https://predr.ag/blog/is-this-trait-sealed-or-not-sealed/
如何用一个Mutex就造成Tokio应用程序死锁
作者构造了一个小示例,演示了如何用一个Mutex就造成Tokio应用程序死锁。很适合学习。
https://turso.tech/blog/how-to-deadlock-tokio-application-in-rust-with-just-a-single-mutex
--
From 日报小组 Mike
社区学习交流平台订阅:
评论区
写评论还没有评论