0.1.4 |
|
---|---|
0.1.3 |
|
0.1.2 |
|
0.1.1 |
|
#12 in #crystal
13KB
142 代码行
编译符号 💠
注意:此软件包已重命名为 smol-symbol,所有未来的更新都可以在该软件包中找到。您应继续使用 smol-symbol
而不是 compile-symbol
。
此软件包提供在编译时以及在运行时创建全局唯一(基于输入值)、可读性强的 Symbol
的功能,这些符号旨在类似于 Crystal 编程语言中的 Symbol
类型。
此软件包的不同之处在于我们的 Symbol
的字母表和长度更加严格,允许我们将每个 Symbol
的整个文本作为内部的 u128
进行编码。唯一的缺点是我们限制长度为25个字符,并且字母表由小写字母 a-z 以及 _
组成。不允许使用其他字符。
可以使用方便的 s!
宏在编译时创建 Symbol
类型,也可以使用 TryFrom<AsRef<str>>
实现在运行时创建,尽管这不如使用 s!
宏在编译时那样高效。
Symbol
类型也可以通过方便的 Into<String>
实现转换为 String
。
示例
#[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());
}
请参阅 Symbol
和 s!
的文档以获取更多信息。
依赖项
~3–11MB
~114K SLoC