#唯一标识符 #符号 #唯一 #编译时 #水晶 #

smol-symbol

提供编译时全局唯一、25个字符、128位的符号,类似于 Crystal 语言中的 Symbol 类型

3 个版本

0.1.7 2023年7月20日
0.1.6 2023年7月13日
0.1.5 2023年7月9日

#2069 in Rust 模式

MIT 许可证

16KB
145

smol-symbol 💠

Crates.io docs.rs Build Status MIT License

此软件包提供了在编译时(以及运行时)创建全局唯一(针对输入值)、可读的 Symbol 的能力,这些符号旨在让人联想到 Crystal 编程语言中的 Symbol 类型。

此软件包与 Crystal 语言中的 Symbol 类型不同的是,我们的 Symbol 的字母表和长度更为严格,这使得我们能够将每个 Symbol 的整个文本编码为内部的 u128。唯一的缺点是我们限于 25 个字符的长度和由小写字母 a-z 以及 _ 组成的字母表。不允许使用其他字符。

可以使用方便的 s! 宏在编译时创建 Symbol 类型,也可以使用 TryFrom<AsRef<str>> 实现在运行时创建,尽管这不如使用 s! 宏在编译时那样高效。

还可以通过方便的 Into<String> 实现将 Symbol 类型转换为 String

我们还提供了通过方便的 custom_alphabet! 宏定义自定义字母表的能力,这允许您直接更改这些限制(较小的字母表 = 符号的最大长度更大)并添加对其他语言或更宽松的字符集的支持。目前无法自定义的唯一不变量是 CustomSymbol 总是使用 u128 作为其支持数据存储。

示例

#[test]
fn symbol_example() {
    // Symbols can be stored in variables
    let sym1 = s!(hello_world);

    // Symbols can be used in const contexts
    const SYM2: Symbol = s!(goodnight);

    // Symbols can be compared with each other
    let sym3 = s!(hello_world);
    assert_eq!(sym1, sym3);
    assert_ne!(sym1, SYM2);
    assert_ne!(s!(this_is_a_triumph), s!(im_making_a_note_here));

    // Symbols are 16 bytes
    assert_eq!(std::mem::size_of_val(&sym1), 16);
    assert_eq!(std::mem::size_of_val(&sym1), std::mem::size_of::<u128>());

    // Symbols can even be created dynamically at runtime!
    let some_string = String::from("some_random_string");
    let dynamic_sym = Symbol::try_from(some_string).unwrap();
    assert_eq!(dynamic_sym, s!(some_random_string));

    // Can't be longer than 25 characters
    assert!(Symbol::try_from("this_is_too_long_to_store_").is_err());
    assert!(Symbol::try_from("this_is_just_short_enough").is_ok());

    // Character alphabet is limited to lowercase a-z and _
    assert!(Symbol::try_from("this-is-invalid").is_err());
    assert!(Symbol::try_from("this is_invalid").is_err());
    assert!(Symbol::try_from("this.is.invalid").is_err());
}

有关 Symbols! 的更多详细信息,请参阅文档。

依赖项

~4–12MB
~140K SLoC