在 Rust 1.0 之前,我可以使用这种过时的闭包语法编写一个结构:
struct Foo {
pub foo: |usize| -> usize,
}
现在我可以做类似的事情:
struct Foo<F: FnMut(usize) -> usize> {
pub foo: F,
}
但是我创建的 Foo
对象的类型是什么?
let foo: Foo<???> = Foo { foo: |x| x + 1 };
我也可以使用引用:
struct Foo<'a> {
pub foo: &'a mut FnMut(usize) -> usize,
}
我认为这比较慢,因为
- 指针解引用
- 对于实际最终使用的
FnMut
类型没有专门化
最佳答案
补充 the existing answer还有一些用于演示目的的代码:
未装箱闭包
使用通用类型:
struct Foo<F>
where
F: Fn(usize) -> usize,
{
pub foo: F,
}
impl<F> Foo<F>
where
F: Fn(usize) -> usize,
{
fn new(foo: F) -> Self {
Self { foo }
}
}
fn main() {
let foo = Foo { foo: |a| a + 1 };
(foo.foo)(42);
(Foo::new(|a| a + 1).foo)(42);
}
盒装特征对象
struct Foo {
pub foo: Box<dyn Fn(usize) -> usize>,
}
impl Foo {
fn new(foo: impl Fn(usize) -> usize + 'static) -> Self {
Self { foo: Box::new(foo) }
}
}
fn main() {
let foo = Foo {
foo: Box::new(|a| a + 1),
};
(foo.foo)(42);
(Foo::new(|a| a + 1).foo)(42);
}
性状对象引用
struct Foo<'a> {
pub foo: &'a dyn Fn(usize) -> usize,
}
impl<'a> Foo<'a> {
fn new(foo: &'a dyn Fn(usize) -> usize) -> Self {
Self { foo }
}
}
fn main() {
let foo = Foo { foo: &|a| a + 1 };
(foo.foo)(42);
(Foo::new(&|a| a + 1).foo)(42);
}
函数指针
struct Foo {
pub foo: fn(usize) -> usize,
}
impl Foo {
fn new(foo: fn(usize) -> usize) -> Self {
Self { foo }
}
}
fn main() {
let foo = Foo { foo: |a| a + 1 };
(foo.foo)(42);
(Foo::new(|a| a + 1).foo)(42);
}
what's the type of a
Foo
object I create?
这是一个无法命名的自动生成的类型。
I could also use a reference [...] slower because [...] the pointer deref [...] no specialization
也许吧,但这对调用者来说会容易得多。
另见:
- How do I call a function through a member variable?
- Returning a closure from a function
- How to return an anonymous type from a trait method without using Box?
- Closures as a type in a Rust struct
- Types of unboxed closures being unique to each
- Why does passing a closure to function which accepts a function pointer not work?
- What does "dyn" mean in a type?
关于closures - 如何在 Rust 的结构中存储闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27831944/