如何将显式生命周期绑定到返回的特征?
How do I apply an explicit lifetime bound to a returned trait?
在 Rust 中从一个函数返回一个迭代器是一个 Sisyphean 维度的练习,但我被告知可以 return 一个作为特征而没有那么多痛苦。不幸的是,它不起作用:显然,我需要一个明确的生命周期限制?这显然与添加生命周期参数不同。这意味着我不知道该怎么做。
这是我的(小的,测试的)代码:
fn main() {
let args = get_args();
for arg in args {
println!("{}", arg);
}
}
fn get_args() -> Iterator {
std::env::args().filter_map(|arg| arg.into_string().ok())
}
真正有效的适当方法是什么?
编辑:rust 版本 rustc 1.0.0-nightly (00df3251f 2015-02-08 23:24:33 +0000)
你不能 return 函数中的裸 Iterator
,因为它是一个特征,因此不是大小类型。
在您的情况下,您需要将迭代器对象放入一个框内,以使其成为一个可以从函数 return 编辑的大小对象。
为此,您可以像这样更改代码:
fn get_args() -> Box<Iterator<Item=String> + 'static> {
Box::new(std::env::args().filter_map(|arg| arg.into_string().ok()))
}
这里我为 trait 对象添加了生命周期说明符 'static
,这意味着它是完全自有的(一个不带参数的函数几乎总是 return 对 'static
这个意义上的生命周期。
您还需要 <Item=String>
部分来明确迭代器生成的数据类型。在这种情况下:Strings.
在这种特定情况下,您可以从 get_args 中设法 return 一个具体类型,如下所示:
fn get_args() -> FilterMap<Args, fn(OsString) -> Option<String>> {
fn arg_into_string(arg: OsString) -> Option<String> { arg.into_string().ok() }
args().filter_map(arg_into_string as fn(OsString) -> Option<String>)
}
基本上这适用于您在迭代器适配器中使用的闭包(在您的情况下 filter_map)并不是真正的闭包的所有情况,因为它不捕获任何环境,并且它可以是由一个普通的旧函数建模。
一般来说,如果您确实需要 return 包含闭包的类型,您确实需要将其装箱并 return 特征对象。你的情况:
fn get_args() -> Box<Iterator<Item=String> + 'static> {
Box::new(std::env::args().filter_map(|arg| arg.into_string().ok()))
}
在 Rust 中从一个函数返回一个迭代器是一个 Sisyphean 维度的练习,但我被告知可以 return 一个作为特征而没有那么多痛苦。不幸的是,它不起作用:显然,我需要一个明确的生命周期限制?这显然与添加生命周期参数不同。这意味着我不知道该怎么做。
这是我的(小的,测试的)代码:
fn main() {
let args = get_args();
for arg in args {
println!("{}", arg);
}
}
fn get_args() -> Iterator {
std::env::args().filter_map(|arg| arg.into_string().ok())
}
真正有效的适当方法是什么?
编辑:rust 版本 rustc 1.0.0-nightly (00df3251f 2015-02-08 23:24:33 +0000)
你不能 return 函数中的裸 Iterator
,因为它是一个特征,因此不是大小类型。
在您的情况下,您需要将迭代器对象放入一个框内,以使其成为一个可以从函数 return 编辑的大小对象。
为此,您可以像这样更改代码:
fn get_args() -> Box<Iterator<Item=String> + 'static> {
Box::new(std::env::args().filter_map(|arg| arg.into_string().ok()))
}
这里我为 trait 对象添加了生命周期说明符 'static
,这意味着它是完全自有的(一个不带参数的函数几乎总是 return 对 'static
这个意义上的生命周期。
您还需要 <Item=String>
部分来明确迭代器生成的数据类型。在这种情况下:Strings.
在这种特定情况下,您可以从 get_args 中设法 return 一个具体类型,如下所示:
fn get_args() -> FilterMap<Args, fn(OsString) -> Option<String>> {
fn arg_into_string(arg: OsString) -> Option<String> { arg.into_string().ok() }
args().filter_map(arg_into_string as fn(OsString) -> Option<String>)
}
基本上这适用于您在迭代器适配器中使用的闭包(在您的情况下 filter_map)并不是真正的闭包的所有情况,因为它不捕获任何环境,并且它可以是由一个普通的旧函数建模。
一般来说,如果您确实需要 return 包含闭包的类型,您确实需要将其装箱并 return 特征对象。你的情况:
fn get_args() -> Box<Iterator<Item=String> + 'static> {
Box::new(std::env::args().filter_map(|arg| arg.into_string().ok()))
}