Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
9e36111f
R
Rust
项目概览
int
/
Rust
大约 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
9e36111f
编写于
9月 20, 2017
作者:
M
mchlrhw
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implement `entry_and_modify`
上级
183329cf
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
146 addition
and
0 deletion
+146
-0
src/doc/unstable-book/src/library-features/entry-and-modify.md
...oc/unstable-book/src/library-features/entry-and-modify.md
+77
-0
src/liballoc/btree/map.rs
src/liballoc/btree/map.rs
+34
-0
src/libstd/collections/hash/map.rs
src/libstd/collections/hash/map.rs
+35
-0
未找到文件。
src/doc/unstable-book/src/library-features/entry-and-modify.md
0 → 100644
浏览文件 @
9e36111f
# `entry_and_modify`
The tracking issue for this feature is: [#44733]
[
#44733
]:
https://github.com/rust-lang/rust/issues/44733
------------------------
This introduces a new method for the Entry API of maps
(
`std::collections::HashMap`
and
`std::collections::BTreeMap`
), so that
occupied entries can be modified before any potential inserts into the
map.
For example:
```
rust
#![feature(entry_and_modify)]
# fn main() {
use
std
::
collections
::
HashMap
;
struct
Foo
{
new
:
bool
,
}
let
mut
map
:
HashMap
<&
str
,
Foo
>
=
HashMap
::
new
();
map
.entry
(
"quux"
)
.and_modify
(|
e
|
e
.new
=
false
)
.or_insert
(
Foo
{
new
:
true
});
# }
```
This is not possible with the stable API alone since inserting a default
_before_
modifying the
`new`
field would mean we would lose the default state:
```
rust
# fn main() {
use
std
::
collections
::
HashMap
;
struct
Foo
{
new
:
bool
,
}
let
mut
map
:
HashMap
<&
str
,
Foo
>
=
HashMap
::
new
();
map
.entry
(
"quux"
)
.or_insert
(
Foo
{
new
:
true
})
.new
=
false
;
# }
```
In the above code the
`new`
field will never be
`true`
, even though we only
intended to update that field to
`false`
for previously extant entries.
To achieve the same effect as
`and_modify`
we would have to manually match
against the
`Occupied`
and
`Vacant`
variants of the
`Entry`
enum, which is
a little less user-friendly, and much more verbose:
```
rust
# fn main() {
use
std
::
collections
::
HashMap
;
use
std
::
collections
::
hash_map
::
Entry
;
struct
Foo
{
new
:
bool
,
}
let
mut
map
:
HashMap
<&
str
,
Foo
>
=
HashMap
::
new
();
match
map
.entry
(
"quux"
)
{
Entry
::
Occupied
(
entry
)
=>
{
entry
.into_mut
()
.new
=
false
;
},
Entry
::
Vacant
(
entry
)
=>
{
entry
.insert
(
Foo
{
new
:
true
});
},
};
# }
```
src/liballoc/btree/map.rs
浏览文件 @
9e36111f
...
...
@@ -2102,6 +2102,40 @@ pub fn key(&self) -> &K {
Vacant
(
ref
entry
)
=>
entry
.key
(),
}
}
/// Provides in-place mutable access to an occupied entry before any
/// potential inserts into the map.
///
/// # Examples
///
/// ```
/// #![feature(entry_and_modify)]
/// use std::collections::BTreeMap;
///
/// let mut map: BTreeMap<&str, usize> = BTreeMap::new();
///
/// map.entry("poneyland")
/// .and_modify(|e| { *e += 1 })
/// .or_insert(42);
/// assert_eq!(map["poneyland"], 42);
///
/// map.entry("poneyland")
/// .and_modify(|e| { *e += 1 })
/// .or_insert(42);
/// assert_eq!(map["poneyland"], 43);
/// ```
#[unstable(feature
=
"entry_and_modify"
,
issue
=
"44733"
)]
pub
fn
and_modify
<
F
>
(
self
,
mut
f
:
F
)
->
Self
where
F
:
FnMut
(
&
mut
V
)
{
match
self
{
Occupied
(
mut
entry
)
=>
{
f
(
entry
.get_mut
());
Occupied
(
entry
)
},
Vacant
(
entry
)
=>
Vacant
(
entry
),
}
}
}
impl
<
'a
,
K
:
Ord
,
V
:
Default
>
Entry
<
'a
,
K
,
V
>
{
...
...
src/libstd/collections/hash/map.rs
浏览文件 @
9e36111f
...
...
@@ -2002,6 +2002,41 @@ pub fn key(&self) -> &K {
Vacant
(
ref
entry
)
=>
entry
.key
(),
}
}
/// Provides in-place mutable access to an occupied entry before any
/// potential inserts into the map.
///
/// # Examples
///
/// ```
/// #![feature(entry_and_modify)]
/// use std::collections::HashMap;
///
/// let mut map: HashMap<&str, u32> = HashMap::new();
///
/// map.entry("poneyland")
/// .and_modify(|e| { *e += 1 })
/// .or_insert(42);
/// assert_eq!(map["poneyland"], 42);
///
/// map.entry("poneyland")
/// .and_modify(|e| { *e += 1 })
/// .or_insert(42);
/// assert_eq!(map["poneyland"], 43);
/// ```
#[unstable(feature
=
"entry_and_modify"
,
issue
=
"44733"
)]
pub
fn
and_modify
<
F
>
(
self
,
mut
f
:
F
)
->
Self
where
F
:
FnMut
(
&
mut
V
)
{
match
self
{
Occupied
(
mut
entry
)
=>
{
f
(
entry
.get_mut
());
Occupied
(
entry
)
},
Vacant
(
entry
)
=>
Vacant
(
entry
),
}
}
}
impl
<
'a
,
K
,
V
:
Default
>
Entry
<
'a
,
K
,
V
>
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录