在Rust中,如果我返回一个如此定义的闭包:
fn closure_thing() (Fn(String) -> String) {
|thing| {
thing[1..4]
}
}
我收到错误:
= note: `std::ops::Fn(std::string::String) -> std::string::String + 'static` does not have a constant size known at compile-time
= note: the return type of a function must have a statically known size`
我试过Fn(& String) - > & String也是如此。是否有一种简单的方法让闭包将字符串作为参数并返回一个字符串?
答案 0 :(得分:3)
Fn
是一个特质。你不能回归特质。您可以返回一个函数指针:
fn closure_thing() -> (fn(String) -> String) {
fn foo(thing: String) -> String {
…
}
foo
}
您还可以返回Box
:
fn closure_thing() -> Box<Fn(String) -> String> {
Box::new(|thing| {
…
})
}
但是那个有运行时成本,因此应该被视为最后的手段。
如@Veedrac所述,您也可以使用impl Trait
:
#![feature(conservative_impl_trait)]
fn closure_thing() -> impl Fn(String) -> String {
|thing| {
…
}
}
但是从Rust 1.12开始,这还不稳定,需要夜间编译器。它允许您返回任何特征,而无需先前解决方案的运行时成本。
答案 1 :(得分:2)
函数的返回类型必须具有静态已知大小
实现这一目标的一种方法是封闭封闭......
fn closure_thing() -> Box<Fn(String) -> String> {
Box::new(|thing| {
(&thing[1..4]).to_string()
})
}
请注意,我还将结果转换为String
..因为切片会返回str
。
正如mcarton所述,装箱将导致堆分配的运行时成本。