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 在 数据结构
108 每月下载量
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");