6个版本 (3个稳定版)
2.0.0 | 2024年7月11日 |
---|---|
2.0.0-rc1 | 2024年7月10日 |
1.0.1 | 2022年1月18日 |
1.0.0 | 2021年10月23日 |
0.1.0-rc2 | 2021年10月23日 |
1384 在 过程宏
58,052 每月下载量
在 45 个Crates中使用 (通过 ext-trait)
9KB
219 行
::ext-trait
用于轻松定义 ad-hoc / 单次扩展特质的注解。
示例
-
此外
#[macro_use] extern crate ext_trait; #[extension(trait Also)] impl<T> T { fn also (mut self, f: impl FnOnce(&mut Self)) -> Self { f(&mut self); self } } fn main () { use ::std::{collections::HashMap, ops::Not}; let /* immut */ map = HashMap::with_capacity(2).also(|m| { m.insert("foo", 42); m.insert("bar", 27); }); assert!(map.contains_key("foo")); assert!(map.contains_key("bar")); assert!(map.contains_key("baz").not()); }
-
带有路径
#[macro_use] extern crate ext_trait; use ::std::{error::Error, path::{Path, PathBuf}}; #[extension(trait WithPath)] impl PathBuf { fn with (mut self, segment: impl AsRef<Path>) -> PathBuf { self.push(segment); self } } fn main () -> Result<(), Box<dyn Error>> { let some_dir = PathBuf::from(::std::env::var("MY_LIB_SOME_DIR")?); // Contrary to chaining `.join()`, this reuses the memory! let some_subdir = some_dir.with("some").with("sub").with("dir"); // … Ok(()) }
-
上下文
#[macro_use] extern crate ext_trait; use ::std::{error::Error, fmt::Display}; #[extension(trait Context)] impl<Ok, Err : Display> Result<Ok, Err> { fn context (self, prefix: impl Display) -> Result<Ok, String> { self.map_err(|err| format!("{}: {}", prefix, err)) } } fn main () -> Result<(), Box<dyn Error>> { let file_contents = ::std::fs::read_to_string("some/file") .context("Error when opening some/file")? ; // … Ok(()) }
类似于 https://docs.rs/extension-trait,但针对以下
特性
-
支持泛型(见
Context
) -
搜索/
grep 'trait TraitName'
友好!
lib.rs
:
该Crate不打算直接使用。请使用 https://docs.rs/ext-trait。
依赖项
~1.5MB
~35K SLoC