7 个版本

0.2.4 2024 年 3 月 29 日
0.2.3 2022 年 5 月 14 日
0.2.2 2021 年 9 月 12 日
0.2.1 2021 年 5 月 23 日
0.1.1 2021 年 1 月 13 日

#359Rust 模式

Download history 4994/week @ 2024-04-12 5325/week @ 2024-04-19 7081/week @ 2024-04-26 6137/week @ 2024-05-03 6558/week @ 2024-05-10 10768/week @ 2024-05-17 10155/week @ 2024-05-24 7745/week @ 2024-05-31 5493/week @ 2024-06-07 7655/week @ 2024-06-14 6812/week @ 2024-06-21 6081/week @ 2024-06-28 6676/week @ 2024-07-05 7684/week @ 2024-07-12 8044/week @ 2024-07-19 6233/week @ 2024-07-26

29,271 每月下载量
30 个 crate 中使用 (通过 repr_offset)

Zlib 许可证

77KB
1.5K SLoC

Rust crates-io api-docs

此 crate 为类型级字符串提供了类型编码。

示例

索引

此示例演示了如何使用类型级字符串和 Index 特性通过名称访问泛型类型的字段。

use std::ops::Index;

use tstr::{TS, ts};

fn main(){
    takes_person(&Person::new("Bob".into(), "Marley".into()));

    takes_person(&OtherPerson::new("Bob", "Marley"));
}

fn takes_person<P>(pers: &P)
where
    P: Index<TS!(name), Output = str> + Index<TS!(surname), Output = str>
{
    assert_eq!(&pers[ts!(name)], "Bob");
    assert_eq!(&pers[ts!(surname)], "Marley");
}


use person::Person;
mod person {
    use std::ops::Index;

    use tstr::TS;
    
    pub struct Person {
        name: String,
        surname: String,
    }
    
    impl Person {
        pub fn new(name: String, surname: String) -> Self {
            Self{name, surname}
        }
    }
    
    impl Index<TS!(name)> for Person {
        type Output = str;
        
        fn index(&self, _: TS!(name)) -> &str {
            &self.name
        }
    }
   
    impl Index<TS!(surname)> for Person {
        type Output = str;
        
        fn index(&self, _: TS!(surname)) -> &str {
            &self.surname
        }
    }
}

use other_person::OtherPerson;
mod other_person {
    use std::ops::Index;

    use tstr::TS;
    
    pub struct OtherPerson {
        name: &'static str,
        surname: &'static str,
    }
    
    impl OtherPerson {
        pub fn new(name: &'static str, surname: &'static str) -> Self {
            Self{name, surname}
        }
    }
    
    impl Index<TS!(name)> for OtherPerson {
        type Output = str;
        
        fn index(&self, _: TS!(name)) -> &str {
            self.name
        }
    }
   
    impl Index<TS!(surname)> for OtherPerson {
        type Output = str;
        
        fn index(&self, _: TS!(surname)) -> &str {
            self.surname
        }
    }
}

宏展开

此库保留在每个版本和 cargo 功能组合中如何表示内部类型级字符串的权利。

这只会影响您在从该 crate 生成的代码中展开宏并使用展开后的代码而不是通过宏的情况下。

Cargo 功能

  • "rust_1_46":在 tstr::utils 中启用 const 函数,用于比较 &str&[u8]

  • "cmp_traits":启用比较类型级字符串的特性。

  • "use_syn":更改将字面量传递给此 crate 的宏的方式,以使用 syn crate。如果有一些无法解析但有效的 str/integer 字面量,请使用此功能。

  • "min_const_generics":将类型级字符串的表示更改为使用多个 char const 参数,从而为非字母数字 ASCII 字符串提供更好的编译器错误。需要 Rust 1.51.0。

  • "const_generics":将类型级别字符串的表示更改为使用 &'static str 常量参数,从而提高编译器错误提示的质量,并添加了一些新功能。截至 2023-03-17,此功能无法启用,因为它需要 &'static str 能够稳定用作常量参数。如果无法使用此功能,请考虑使用 "nightly_const_generics"

  • "nightly_const_generics":与 "const_generics" 功能等价,并启用夜间编译器的功能以使用 &'static str 常量参数。

  • "for_examples":启用 for_examples 模块,其中包含一些在文档示例中使用的类型。

无标准支持

此crate无条件地使用 #![no_std],并可以在Rust可以使用的任何地方使用。

支持的最小Rust版本

此crate支持Rust 1.40.0及以后的版本。

依赖项

~215KB