当用作函数的å‚数类型或返回类型时,`impl`是什么æ„æ€ï¼Ÿ

时间:2018-01-31 14:52:45

标签: rust

I read this code:

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 ++中实现它?

2 个答案:

答案 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å˜å¾—稳定,这将是其返回类型的更好选项。在这ç§æƒ…况下,调用者ä¸èƒ½ä¾èµ–或引用确切的返回类型,并且å¯ä»¥åœ¨å®žçŽ°ç‰¹å¾çš„任何类型之间切æ¢ï¼ŒåŒ…括匿å闭包,而ä¸ä¼šä¸¢å¤±æºçº§å‘åŽå…¼å®¹æ€§ã€‚