Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
ed63d326
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,发现更多精彩内容 >>
提交
ed63d326
编写于
4月 01, 2015
作者:
N
Niko Matsakis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add (unstable) FnBox trait as a nicer replacement for `Thunk`. The doc
comment includes a test that also shows how it can be used.
上级
d528aa99
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
76 addition
and
0 deletion
+76
-0
src/liballoc/boxed.rs
src/liballoc/boxed.rs
+75
-0
src/libstd/lib.rs
src/libstd/lib.rs
+1
-0
未找到文件。
src/liballoc/boxed.rs
浏览文件 @
ed63d326
...
...
@@ -355,3 +355,78 @@ fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
}
}
}
/// `FnBox` is a version of the `FnOnce` intended for use with boxed
/// closure objects. The idea is that where one would normally store a
/// `Box<FnOnce()>` in a data structure, you should use
/// `Box<FnBox()>`. The two traits behave essentially the same, except
/// that a `FnBox` closure can only be called if it is boxed. (Note
/// that `FnBox` may be deprecated in the future if `Box<FnOnce()>`
/// closures become directly usable.)
///
/// ### Example
///
/// Here is a snippet of code which creates a hashmap full of boxed
/// once closures and then removes them one by one, calling each
/// closure as it is removed. Note that the type of the closures
/// stored in the map is `Box<FnBox() -> i32>` and not `Box<FnOnce()
/// -> i32>`.
///
/// ```
/// #![feature(core)]
///
/// use std::boxed::FnBox;
/// use std::collections::HashMap;
///
/// fn make_map() -> HashMap<i32, Box<FnBox() -> i32>> {
/// let mut map: HashMap<i32, Box<FnBox() -> i32>> = HashMap::new();
/// map.insert(1, Box::new(|| 22));
/// map.insert(2, Box::new(|| 44));
/// map
/// }
///
/// fn main() {
/// let mut map = make_map();
/// for i in &[1, 2] {
/// let f = map.remove(&i).unwrap();
/// assert_eq!(f(), i * 22);
/// }
/// }
/// ```
#[cfg(not(stage0))]
#[rustc_paren_sugar]
#[unstable(feature
=
"core"
,
reason
=
"Newly introduced"
)]
pub
trait
FnBox
<
A
>
{
type
Output
;
extern
"rust-call"
fn
call_box
(
self
:
Box
<
Self
>
,
args
:
A
)
->
Self
::
Output
;
}
#[cfg(not(stage0))]
impl
<
A
,
F
>
FnBox
<
A
>
for
F
where
F
:
FnOnce
<
A
>
{
type
Output
=
F
::
Output
;
extern
"rust-call"
fn
call_box
(
self
:
Box
<
F
>
,
args
:
A
)
->
F
::
Output
{
self
.call_once
(
args
)
}
}
#[cfg(not(stage0))]
impl
<
A
,
R
>
FnOnce
<
A
>
for
Box
<
FnBox
<
A
,
Output
=
R
>>
{
type
Output
=
R
;
extern
"rust-call"
fn
call_once
(
self
,
args
:
A
)
->
R
{
self
.call_box
(
args
)
}
}
#[cfg(not(stage0))]
impl
<
A
,
R
>
FnOnce
<
A
>
for
Box
<
FnBox
<
A
,
Output
=
R
>+
Send
>
{
type
Output
=
R
;
extern
"rust-call"
fn
call_once
(
self
,
args
:
A
)
->
R
{
self
.call_box
(
args
)
}
}
src/libstd/lib.rs
浏览文件 @
ed63d326
...
...
@@ -243,6 +243,7 @@
#[path
=
"num/f64.rs"
]
pub
mod
f64
;
pub
mod
ascii
;
pub
mod
thunk
;
/* Common traits */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录