#hash-map #extension #btree-map #reference #mutable #mutability #multiple

multi_mut

HashMap和BTreeMap上用于安全获取包含值的多个可变引用的方法

4次发布

使用旧的Rust 2015

0.1.3 2017年1月17日
0.1.2 2017年1月17日
0.1.1 2017年1月17日
0.1.0 2017年1月17日

#2024数据结构

Download history • Rust 包仓库 4/week @ 2023-12-18 • Rust 包仓库 4/week @ 2024-01-08 • Rust 包仓库 7/week @ 2024-01-15 • Rust 包仓库 6/week @ 2024-02-12 • Rust 包仓库 30/week @ 2024-02-19 • Rust 包仓库 29/week @ 2024-02-26 • Rust 包仓库 21/week @ 2024-03-04 • Rust 包仓库 27/week @ 2024-03-11 • Rust 包仓库 25/week @ 2024-03-18 • Rust 包仓库

108 每月下载量

MIT 许可证

41KB
844

multi_mut

为HashMap和BTreeMap提供一系列扩展方法,这些方法提供了安全API以获取包含值中的多个可变引用。运行时检查用于防止可变别名。

使用方法

添加到Cargo.toml:

[dependencies]
multi_mut = "0.1"

将扩展特性引入你的代码作用域

extern crate multi_mut;
use multi_mut::HashMapMultiMut;

extern crate multi_mut;
use multi_mut::BTreeMapMultiMut;

你现在可以安全地拥有多个HashMap或BTreeMap的可变引用!

    let (one, two) = map.get_pair_mut("key_one", "key_two").unwrap();
    
    assert_eq!(one, "value_one");
    assert_eq!(two, "value_two");

    one.push_str("_edited");
    two.push_str("_edited");

    assert_eq!(one, "value_one_edited");
    assert_eq!(two, "value_two_edited");

可用的函数快速列表

  • get_pair_mut(key, key) 返回一个包含在 Option 中的可变引用对
  • pair_mut(key, key) 返回一个包含在可变引用对,如果键不存在则恐慌。
  • get_triple_mut(key, key, key) 返回一个包含在 Option 中的可变引用三元组
  • triple_mut(key, key, key) 返回一个包含在可变引用三元组,如果键不存在则恐慌。
  • multi_mut()iter_multi_mut() 返回任意数量的可变引用。请查看下面的示例。

为了防止可变别名,如果输入键不是唯一的,所有函数都将引发恐慌。没有函数分配资源。代码如下:multi_mut()iter_multi_mut() 每次从 HashMap/BTreeMap 中拉出一个可变引用时,都会在指针缓冲区中进行线性搜索。在实践中,这已经足够快。

如何使用 multi_mut()iter_multi_mut()

multi_mut()iter_multi_mut() 需要一个可变缓冲区来跟踪现有的引用,以防止可变别名。请参见示例中的这一行 let mut buffer = [std::ptr::null(); 3];。缓冲区的大小决定了您可以从底层 HashMap/BTreeMap 中提取多少值。

这两种方法的区别在于,multi_mut() 返回一个包装器,可以用来通过 get_mut(&K) -> Option<&mut V>mut_ref(&K) -> &mut V (如果键不存在则引发恐慌) 方法从 HashMap/BTreeMap 获取可变引用,而 iter_multi_mut() 需要事先提供一个键列表,然后返回一个输出可变引用的迭代器。

multi_mut() 的示例

    let mut buffer = [std::ptr::null(); 3];
    let mut wrapper = map.multi_mut(&mut buffer);
    
    let one = wrapper.get_mut("key_one").unwrap();
    let two = wrapper.get_mut("key_two").unwrap();
    let three = wrapper.get_mut("key_three").unwrap();

    assert_eq!(one, "value_one");
    assert_eq!(two, "value_two");
    assert_eq!(three, "value_three");

    one.push_str("_edited");
    two.push_str("_edited");
    three.push_str("_edited");

    assert_eq!(one, "value_one_edited");
    assert_eq!(two, "value_two_edited");
    assert_eq!(three, "value_three_edited");

iter_multi_mut() 的示例

    let mut buffer = [std::ptr::null(); 3];
    let keys = ["key_one", "key_two", "key_three"];
    let mut wrapper = map.iter_multi_mut(&keys, &mut buffer);
    
    let one = wrapper.next().unwrap();
    let two = wrapper.next().unwrap();
    let three = wrapper.next().unwrap();

    assert_eq!(one, "value_one");
    assert_eq!(two, "value_two");
    assert_eq!(three, "value_three");

    one.push_str("_edited");
    two.push_str("_edited");
    three.push_str("_edited");

    assert_eq!(one, "value_one_edited");
    assert_eq!(two, "value_two_edited");
    assert_eq!(three, "value_three_edited");

无运行时依赖