3 个不稳定版本

0.2.0 2024年1月20日
0.1.1 2024年1月13日
0.1.0 2024年1月8日

#11 in #mut

每月 31 次下载

MIT/Apache

21KB
272

MutStr

Contributors Forks Stargazers Issues

MutStr 是一个很好的解决方案,如果您想减少如哈希表(如 <String, String>)的内存消耗,并且需要比 Box<str> 更高效的解决方案,因为您需要在运行时更改数据。

如果运行时不需要更改数据,请使用 Box<str>。如果您在添加新数据时更看重速度,请选择 String。如果您需要低内存消耗和可更改的数据,请选择 MutStr

“...比 Box<str> 更高效...”是什么意思?

Box<str> 的内部值不能更改,因此,旧的 Box<str> 必须被替换为一个新分配的 Box<str>,这比重新分配内部值更不高效。请参阅我们的基准测试

基准测试结果

此基准测试于 2024年1月13日 更新,可在 此处 找到。

create_box                   28 ns/iter (+/- 3)
create_string                28 ns/iter (+/- 1)
create_mutstr                28 ns/iter (+/- 0)
replace_box_data             104 ns/iter (+/- 3)
replace_string_data          85 ns/iter (+/- 7)
replace_mutstr_data          82 ns/iter (+/- 1)

示例

您可以使用 MutStr 轻松添加新值或删除现有值。

use mutstr::mutstr;

fn main() {
  let mut result = mutstr::from("hello");
  result += " my friend"; // Add -> " my friend"
  result -= " friend"; // Remove -> " friend"
  assert_eq!(result.as_str(), "hello my");
  
  result.push(" friend friend friend"); // Add -> " friend friend friend"
  result -= (2, " friend"); // Remove(2 times) -> " friend"
  assert_eq!(result.as_str(), "hello my friend");
  
  result += String::from(" :)"); // Add -> " :)"
  assert_eq!(result.as_str(), "hello my friend :)");
}

示例

您可以从 MutStr 轻松获取一个 &str,就像使用 String 一样。

use mutstr::mutstr;

fn main() {
  let first = String::from("hello friend");
  let first_str = &*first; // String as `&str`
  let second = mutstr::from("hello friend");
  let second_str = &*second; // MutStr as `&str`
  assert_eq!(first_str, second_str);
}

示例

您可以将 MutStr 容易地用于哈希表和向量中,就像您可以使用 Box<str> 一样。

use std::collections::HashMap;
use mutstr::mutstr;

fn main() {
  let mut result = HashMap::<Box<str>, mutstr>::new();
  result.insert(Box::from("hello"), mutstr::from("friend"));
  
  let value = result.get_mut("hello").unwrap();
  *value += " :)";
  
  assert_eq!(value.as_str(), "friend :)");
}

依赖项

~175KB