我如何在 Rust 中使用 yield 关键字?
How do I use the yield keyword in Rust?
我正在尝试创建一个函数,它将 return 目录中所有文件的迭代器,包括子目录中的所有文件。因为我不知道包含所有文件路径的数组的大小,所以我认为让函数 return 成为迭代器而不是数组会更容易。在 Python:
中很简单
def func():
for i in range(0, 100):
yield i
for i in func():
print(i)
但是当我尝试在 Rust 中做类似的事情时,我收到编译器错误 and/or 编译器恐慌。在这里,我尝试了一些接近于 Python:
中的基本语法
fn func() -> Iterator {
for i in 0..100 {
yield i;
}
}
fn main() {
for i in func() {
println!("{}", i);
}
}
但是当我编译它时,它导致了两个错误和一个警告:
error[E0658]: yield syntax is experimental
--> src/main.rs:3:9
|
3 | yield i;
| ^^^^^^^
|
= note: see issue #43122 <https://github.com/rust-lang/rust/issues/43122> for more information
warning: trait objects without an explicit `dyn` are deprecated
--> src/main.rs:1:14
|
1 | fn func() -> Iterator {
| ^^^^^^^^ help: use `dyn`: `dyn Iterator`
|
= note: `#[warn(bare_trait_objects)]` on by default
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2021!
= note: for more information, see issue #80165 <https://github.com/rust-lang/rust/issues/80165>
error[E0191]: the value of the associated type `Item` (from trait `Iterator`) must be specified
--> src/main.rs:1:14
|
1 | fn func() -> Iterator {
| ^^^^^^^^ help: specify the associated type: `Iterator<Item = Type>`
Some errors have detailed explanations: E0191, E0658.
For more information about an error, try `rustc --explain E0191`.
warning: `problem` (bin "problem") generated 1 warning
error: could not compile `problem` due to 2 previous errors; 1 warning emitted
根据错误消息中的帮助,我一直在尝试使用不同的 return 类型,例如 dyn Iterator<Item = i32>
、impl Iterator
等,但我要么得到错误,编译器恐慌,或两者兼而有之。对不起,如果这是一个愚蠢的问题;我只使用 Rust 大约三个月。不过不知怎么的,感觉这样应该更简单一些。
所以我的问题是:使用 yield
关键字生成迭代器的函数 return 的正确语法是什么?我查看了 Rust Documentation and The Book,但没有发现任何有用的东西。
迭代器需要实现 Iterator
特征。
Rust 没有为 生成器 使用 yield
关键字(现在,Rust 1.57
),所以你不能使用它.
您的代码的直接翻译将是:
fn func() -> impl Iterator<Item=u32> {
0..100u32
}
fn main() {
for i in func() {
println!("{}", i);
}
}
(0..100)
是实现 Iterator
的 Range
对象
参考资料
我正在尝试创建一个函数,它将 return 目录中所有文件的迭代器,包括子目录中的所有文件。因为我不知道包含所有文件路径的数组的大小,所以我认为让函数 return 成为迭代器而不是数组会更容易。在 Python:
中很简单def func():
for i in range(0, 100):
yield i
for i in func():
print(i)
但是当我尝试在 Rust 中做类似的事情时,我收到编译器错误 and/or 编译器恐慌。在这里,我尝试了一些接近于 Python:
中的基本语法fn func() -> Iterator {
for i in 0..100 {
yield i;
}
}
fn main() {
for i in func() {
println!("{}", i);
}
}
但是当我编译它时,它导致了两个错误和一个警告:
error[E0658]: yield syntax is experimental
--> src/main.rs:3:9
|
3 | yield i;
| ^^^^^^^
|
= note: see issue #43122 <https://github.com/rust-lang/rust/issues/43122> for more information
warning: trait objects without an explicit `dyn` are deprecated
--> src/main.rs:1:14
|
1 | fn func() -> Iterator {
| ^^^^^^^^ help: use `dyn`: `dyn Iterator`
|
= note: `#[warn(bare_trait_objects)]` on by default
= warning: this is accepted in the current edition (Rust 2018) but is a hard error in Rust 2021!
= note: for more information, see issue #80165 <https://github.com/rust-lang/rust/issues/80165>
error[E0191]: the value of the associated type `Item` (from trait `Iterator`) must be specified
--> src/main.rs:1:14
|
1 | fn func() -> Iterator {
| ^^^^^^^^ help: specify the associated type: `Iterator<Item = Type>`
Some errors have detailed explanations: E0191, E0658.
For more information about an error, try `rustc --explain E0191`.
warning: `problem` (bin "problem") generated 1 warning
error: could not compile `problem` due to 2 previous errors; 1 warning emitted
根据错误消息中的帮助,我一直在尝试使用不同的 return 类型,例如 dyn Iterator<Item = i32>
、impl Iterator
等,但我要么得到错误,编译器恐慌,或两者兼而有之。对不起,如果这是一个愚蠢的问题;我只使用 Rust 大约三个月。不过不知怎么的,感觉这样应该更简单一些。
所以我的问题是:使用 yield
关键字生成迭代器的函数 return 的正确语法是什么?我查看了 Rust Documentation and The Book,但没有发现任何有用的东西。
迭代器需要实现 Iterator
特征。
Rust 没有为 生成器 使用 yield
关键字(现在,Rust 1.57
),所以你不能使用它.
您的代码的直接翻译将是:
fn func() -> impl Iterator<Item=u32> {
0..100u32
}
fn main() {
for i in func() {
println!("{}", i);
}
}
(0..100)
是实现 Iterator
Range
对象