我在迭代器上应用了一个闭包,我想使用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)
但我不明白
在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具有多个线程的访问权限.所以我必须同时使用Rc和Arc.
这Foo是有益的:我实现Foo两者Rc和Arc(Foo将需要Deref)并使用T绑定的参数Foo.这就是我想要一个结构用于单线程和多线程使用的方式.
我想在宏生成的文档中使用宏变量:
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'
我正在使用未来的库,我有一个实现的未来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)?
我想要一个函数来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)
问题是,有时我知道类型,有时不知道.有没有办法既可以为特征对象提供动态调度,也可以为编译时已知类型提供静态调度,而不实现两次?
如何在文档代码中写一行,但让编译器忽略它?
我想写
/// # 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).
编辑:我也想要货物运行的例子,但遗漏一行.