小编tor*_*eyy的帖子

为什么需要使用plus运算符(Iterator <Item =&Foo> +'a)为特征添加生命周期?

我在迭代器上应用了一个闭包,我想使用stable,所以我想返回一个盒装Iterator.这样做的显而易见的方法如下:

struct Foo;

fn into_iterator(myvec: &Vec<Foo>) -> Box<dyn Iterator<Item = &Foo>> {
    Box::new(myvec.iter())
}
Run Code Online (Sandbox Code Playgroud)

这是失败的,因为借用检查器无法推断出适当的生命周期.

经过一番研究,我找到了正确的方法来返回迭代器?,这让我想补充一下+ 'a:

fn into_iterator<'a>(myvec: &'a Vec<Foo>) -> Box<dyn Iterator<Item = &'a Foo> + 'a> {
    Box::new(myvec.iter())
}
Run Code Online (Sandbox Code Playgroud)

但我不明白

  • 这是做什么的
  • 为什么需要这里呢

lifetime rust

13
推荐指数
1
解决办法
761
查看次数

没有类型参数的泛型类型的通用结构

在Rust中可以做这样的事吗?

trait Foo<T> {}

struct A;
struct B;

struct Bar<T: Foo> {
    a: T<A>,
    b: T<B>
}
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用两个参数Bar,但我认为必须有更好的方法来做到这一点.

我想实现一个Graph结构.因为我不能将节点和边缘绑定到父母的生命周期,我希望有类似的东西Rc.但是,有时可能需要Graph具有多个线程的访问权限.所以我必须同时使用RcArc.

Foo是有益的:我实现Foo两者RcArc(Foo将需要Deref)并使用T绑定的参数Foo.这就是我想要一个结构用于单线程和多线程使用的方式.

generics higher-kinded-types rust

9
推荐指数
2
解决办法
3162
查看次数

如何将Rust宏变量嵌入到文档中?

我想在宏生成的文档中使用宏变量:

macro_rules! impl_foo {
    ($name:ident) => {
        /// Returns a new `$name`.
        fn myfoo() -> $name {

        }
    };
}
Run Code Online (Sandbox Code Playgroud)

但是,变量不会被替换.我也尝试过使用这个#[doc]属性:

macro_rules! impl_foo {
    ($name:ident) => {
        #[doc = concat!("Returns a new `", $name, "`.")]
        fn myfoo() -> $name {

        }
    };
}
Run Code Online (Sandbox Code Playgroud)

这个甚至无法解析: unexpected token: 'concat'

documentation macros rust

7
推荐指数
2
解决办法
407
查看次数

等待结果映射未来

我正在使用未来的库,我有一个实现的未来Future<T, E>.我想这个未来的函数映射FnOnce(T) -> D在那里D: From<E>.现在,当我想要wait()这个未来的finsih时,我会得到一个Result<Result<T, E>, D>,但是我想要一个Result<T, D>.

以下是一些示例代码,以便更好地理解:

struct ReadError;

enum DownloadError {
    Read(ReadError),
    Parse(ParseError),
}

impl From<ReadError> for DownloadError { ... }

fn parse(bytes: [u8; 4]) -> Result<i32, DownloadError> { ... }

fn map_and_wait<F: Future<Item = [u8; 4]; Error = ReadError>>(f: F) -> Result<i32, DownloadError> {
    match f.map(|x| parse(x)).wait() {
        Ok(Ok(x)) => Ok(x),
        Ok(Err(x)) => Err(x.into()),
        Err(x) => Err(x),
    }
}
Run Code Online (Sandbox Code Playgroud)

这样做最简单,最容易理解的方式是什么(没有match)?

future rust

6
推荐指数
1
解决办法
1125
查看次数

用动态和静态调度实现特征实现者的功能

我想要一个函数来foo获取一个实现特征的类型的实例A.我总是喜欢使用泛型来进行静态调度:

trait A {}

fn foo<T: A>(t: T) {}
Run Code Online (Sandbox Code Playgroud)

但是,这种方法引入了一些不灵活性,我无法传递像这里的特征对象:

trait A {}

fn foo(t: &A) {}
Run Code Online (Sandbox Code Playgroud)

问题是,有时我知道类型,有时不知道.有没有办法既可以为特征对象提供动态调度,也可以为编译时已知类型提供静态调度,而不实现两次?

generics rust

5
推荐指数
1
解决办法
69
查看次数

如何在doc测试中忽略的文档中添加一行?

如何在文档代码中写一行,但让编译器忽略它?

我想写

/// # Examples
///
/// To clone something, do
///
/// ```
/// IGNORE_FOR_COMPILATION_BUT_SHOW: let cloned = myValue.clone();
/// # let cloned = 5.clone();
/// ```
Run Code Online (Sandbox Code Playgroud)

我想得到:

例子

要克隆某事,做

let cloned = myValue.clone();
Run Code Online (Sandbox Code Playgroud)

但编译器仍应编译示例(克隆5).

编辑:我也想要货物运行的例子,但遗漏一行.

documentation rust rust-cargo rustdoc

4
推荐指数
2
解决办法
270
查看次数