#string #const-generics #stack-allocated #size #constant #type #copied

no-std fixedstr

常量最大尺寸的字符串,可以使用 const 泛型进行复制和栈分配

34 个版本

0.5.7 2024年6月25日
0.5.5 2024年1月30日
0.5.4 2023年12月13日
0.5.3 2023年11月21日
0.1.1 2021年11月21日

#93 in Rust 模式

Download history 16765/week @ 2024-05-01 17354/week @ 2024-05-08 14340/week @ 2024-05-15 15319/week @ 2024-05-22 15149/week @ 2024-05-29 14241/week @ 2024-06-05 14970/week @ 2024-06-12 14623/week @ 2024-06-19 14082/week @ 2024-06-26 13459/week @ 2024-07-03 12575/week @ 2024-07-10 14621/week @ 2024-07-17 15864/week @ 2024-07-24 18527/week @ 2024-07-31 16300/week @ 2024-08-07 13685/week @ 2024-08-14

67,002 每月下载量
用于 22 个 crate (9 直接)

MIT 许可证

215KB
4K SLoC

使用 const 泛型实现多种替代字符串类型的库。大多数类型都可以进行复制和栈分配。某些类型,如 zstr<8>str8,在典型系统上的尺寸小于 &str。

自版本 0.5.1 以来的重要更改

已添加 no-alloc 编译选项。 除了 no_std 之外,此功能将禁用任何需要 alloc crate 的功能,特别是 alloc::string::String。

自版本 0.5.0 以来的重要更改

某些功能的默认可用性已更改。 现在默认情况下,crate 为 #![no_std]。现在默认不启用 std 选项,该选项启用 fstr 类型。现在默认也不启用 FlexstrSharedstr 类型。但是,除非你需要这些三种类型之一,否则你的构建配置很可能与之前相同。如果你已经使用 default-features=false,则你的配置也应与之前相同。有关详细信息以及如何配置构建的示例,请参阅文档。

最近的增强还包括 const 构造函数和其他 const 函数。

示例

  let a:str8 = str8::from("abcdef"); //a str8 can hold up to 7 bytes
  let a2 = a;  // copied, not moved
  let ab = a.substr(1,5);  // copies substring to new string
  assert_eq!(ab, "bcde");  // compare for equality with &str, derefs to &str
  assert!(a<ab); // and Ord, Hash, Debug, Eq, other common traits
  let astr:&str = a.to_str(); // convert to &str (zero copy)
  let aowned:String = a.to_string(); // convert to owned string
  let afstr:fstr<8> = fstr::from(a); // fstr is another fixedstr crate type
  let azstr:zstr<16> = zstr::from(a); // so is zstr
  let a32:str32 = a.resize(); // same kind of string but with 31-byte capacity  
  let mut u = str8::from("aλb"); //unicode support
  assert_eq!(u.nth(1), Some('λ'));  // get nth character
  assert_eq!(u.nth_ascii(3), 'b');  // get nth byte as ascii character
  assert!(u.set(1,'μ'));  // changes a character of the same character class
  assert!(!u.set(1,'c')); // .set returns false on failure
  assert!(u.set(2,'c'));
  assert_eq!(u, "aμc");
  assert_eq!(u.len(),4);  // length in bytes
  assert_eq!(u.charlen(),3);  // length in chars
  let mut ac:str16 = a.reallocate().unwrap(); //copies to larger capacity type
  let remainder = ac.push("ghijklmnopq"); //append up to capacity, returns remainder
  assert_eq!(ac.len(),15);
  assert_eq!(remainder, "pq");
  ac.truncate(9);  // keep first 9 chars
  assert_eq!(&ac,"abcdefghi");
  let (upper,lower) = (str8::make("ABC"), str8::make("abc"));
  assert_eq!(upper, lower.to_ascii_upper()); // no owned String needed

  let c1 = str8::from("abcd"); // string concatenation with + for strN types  
  let c2 = str8::from("xyz");
  let mut c3 = c1 + c2 + "123";           
  assert_eq!(c3,"abcdxyz123");
  assert_eq!(c3.capacity(),15);  // type of c3 is resized to str16
  c3 = "00" + c3;                // concat &str left or right
  assert_eq!(c3,"00abcdxyz123");

  let c4 = str_format!(str16,"abc {}{}{}",1,2,3); // impls core::fmt::Write
  assert_eq!(c4,"abc 123");  //str_format! truncates if capacity exceeded
  let c5 = try_format!(str8,"abcdef{}","ghijklmn");
  assert!(c5.is_none());  // try_format! returns None if capacity exceeded

  const C:str8 = str8::const_make("abcd");    // const constructor
  let xarray = [0u8;C.len()];                 // const length function

有关详细信息,请参阅 文档

依赖项