pub fn up_to(limit: u64) -> impl Generator<Yield = u64, Return = u64> {
move || {
for x in 0..limit {
yield x;
}
return limit;
}
}
impl
是什么æ„æ€ï¼Ÿå¦‚何在普通的Rust或C ++ä¸å®žçŽ°å®ƒï¼Ÿ
ç”案 0 :(得分:5)
这是新的impl Trait
è¯æ³•ï¼Œå®ƒå…许程åºå‘˜é¿å…命å泛型类型。该功能为still being implemented。
在这里,它在返回ä½ç½®ä¸ç”¨æ¥è¡¨ç¤ºï¼†ï¼ƒ34;返回的类型将实现这个特性,这就是我所说的所有#34;。在这ç§æƒ…况下,请注æ„函数的所有返回路径必须返回完全相åŒçš„具体类型。
è¯æ³•ä¹Ÿå¯ç”¨äºŽå‚æ•°ä½ç½®ï¼Œåœ¨è¿™ç§æƒ…况下,调用者决定è¦ä¼ 递的具体类型。
å¦è§ï¼š
ç”案 1 :(得分:2)
 Â
impl
是什么æ„æ€ï¼Ÿ
Matthieu解释说,impl X
表示&#34;返回特质X
&#34;的具体实现。如果没有这个,您å¯ä»¥é€‰æ‹©è¿”回实现特å¾çš„具体类型,例如:一个UpToImpl
,或者通过返回Box<Generator>
æ¥åˆ 除该类型。å‰è€…需è¦æš´éœ²ç±»åž‹ï¼Œè€ŒåŽè€…需è¦åŠ¨æ€åˆ†é…和虚拟调度的è¿è¡Œæ—¶æˆæœ¬ã€‚æ›´é‡è¦çš„是,这是生æˆå™¨æ¡ˆä¾‹çš„关键,å‰ä¸€ç§æ–¹æ³•æŽ’除了返回é—åŒ…ï¼Œå› ä¸ºé—包返回匿å类型的值。
 Â如何在普通的Rust或C ++ä¸å®žçŽ°å®ƒï¼Ÿ
如果您的æ„æ€æ˜¯å¦‚何实现up_to
,并且您希望在ä¸äº§ç”Ÿåˆ†é…开销的情况下执行æ¤æ“作,则必须放弃使用é—包并手动将生æˆå™¨é‡å†™ä¸ºå®žçŽ°{{1}的状æ€æœºç‰¹è´¨ï¼š
Generator
è¿™ç§è½¬æ¢æœ¬è´¨ä¸Šæ˜¯Rust编译器在给出包å«#![feature(generator_trait)]
use std::ops::{Generator, GeneratorState};
pub struct UpToImpl {
limit: u64,
x: u64,
}
impl Generator for UpToImpl {
type Yield = u64;
type Return = u64;
fn resume(&mut self) -> GeneratorState<u64, u64> {
let x = self.x;
if x < self.limit {
self.x += 1;
return GeneratorState::Yielded(x);
}
return GeneratorState::Complete(self.limit)
}
}
pub fn up_to(limit: u64) -> UpToImpl {
UpToImpl {x: 0, limit: limit}
}
çš„é—包时在幕åŽæ‰§è¡Œçš„æ“作,除了生æˆçš„ç‰æ•ˆäºŽyield
的类型是匿å的。 (类似但更简å•çš„转æ¢ç”¨äºŽå°†æ™®é€šé—包转æ¢ä¸ºå®žçŽ°UpToImpl
特å¾ä¹‹ä¸€çš„匿å类型的值。)
返回Fn
和具体类型之间还有å¦ä¸€ä¸ªåŒºåˆ«ã€‚返回impl Generator
æ—¶ï¼Œè¯¥ç±»åž‹å¿…é¡»æ˜¯å…¬å…±çš„ï¼Œå› æ¤æˆä¸ºå‡½æ•°ç¾å的一部分。例如,å…许调用者执行æ¤æ“作:
UpToImpl
如果é‡å‘½ålet x: UpToImpl = up_to(10);
,或者您决定切æ¢åˆ°ä½¿ç”¨ç”Ÿæˆå™¨é—包,那么代ç 将会ä¸æ–。
å³ä½¿æ›´æ”¹ä¸ºUpToImpl
,æ¤ç”案ä¸çš„up_to
ä¹Ÿä¼šç¼–è¯‘ï¼Œå› æ¤ä¸€æ—¦impl traitå˜å¾—稳定,这将是其返回类型的更好选项。在这ç§æƒ…况下,调用者ä¸èƒ½ä¾èµ–或引用确切的返回类型,并且å¯ä»¥åœ¨å®žçŽ°ç‰¹å¾çš„任何类型之间切æ¢ï¼ŒåŒ…括匿åé—包,而ä¸ä¼šä¸¢å¤±æºçº§å‘åŽå…¼å®¹æ€§ã€‚