6个版本 (3个稳定版)

2.0.0 2024年7月11日
2.0.0-rc12024年7月10日
1.0.1 2022年1月18日
1.0.0 2021年10月23日
0.1.0-rc22021年10月23日

1384过程宏

Download history 16527/week @ 2024-04-15 16782/week @ 2024-04-22 19125/week @ 2024-04-29 15365/week @ 2024-05-06 19405/week @ 2024-05-13 20438/week @ 2024-05-20 20650/week @ 2024-05-27 21224/week @ 2024-06-03 15971/week @ 2024-06-10 17834/week @ 2024-06-17 25034/week @ 2024-06-24 19603/week @ 2024-07-01 14738/week @ 2024-07-08 15234/week @ 2024-07-15 13786/week @ 2024-07-22 13724/week @ 2024-07-29

58,052 每月下载量
45 个Crates中使用 (通过 ext-trait)

版权:Zlib OR MIT OR Apache-2.0

9KB
219

::ext-trait

用于轻松定义 ad-hoc / 单次扩展特质的注解。

Repository Latest version Documentation MSRV unsafe forbidden License CI

示例

  • 此外

    #[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