gpt4 book ai didi

rust - 在 Rust 的元组中输入匹配 BTreeSet 的类型

转载 作者:行者123 更新时间:2023-11-29 08:13:50 26 4
gpt4 key购买 nike

我有如下代码(更大库的一部分)。编译器告诉我元组没有实现特征,但我有一个元组和该元组的一个元素的实现。它适用于另一种类型的元组。

为什么元组 (BTreeSet<Annotation>)在这里没有匹配?

use std::collections::BTreeSet;

pub struct Axiom {}
pub struct Annotation {}

pub struct AnnotatedAxiom {
pub axiom: Axiom,
pub annotation: BTreeSet<Annotation>,
}

trait Render {
/// Render a entity to Write
fn render(&self);
}

impl<'a, T: Render> Render for &'a BTreeSet<T> {
fn render(&self) {}
}

impl<'a, A: Render> Render for (&'a A,) {
fn render(&self) {
(&self.0).render();
}
}

/// The types in `Render` are too long to type.
macro_rules! render {
($type:ty, $self:ident,
$body:tt) => {

impl Render for $type {
fn render(& $self)
$body
}
}
}

render!{
Annotation, self,
{
}
}
render!{
Axiom, self,
{
}
}

render!{
AnnotatedAxiom, self,
{
// Axiom implements Render
(&self.axiom).render();

// Annotation implements Render
(&self.annotation).render();

// A 1-element tuple of Axiom implements Render
(&self.axiom,).render();

// A 1-element tuple of Annotation does!?
(&self.annotation,).render();

}
}

fn main() {}

Playground

error[E0599]: no method named `render` found for type `(&std::collections::BTreeSet<Annotation>,)` in the current scope
--> src/main.rs:62:29
|
62 | (&self.annotation,).render();
| ^^^^^^
|
= note: the method `render` exists but the following trait bounds were not satisfied:
`(&std::collections::BTreeSet<Annotation>,) : Render`
= help: items from traits can only be used if the trait is implemented and in scope
= note: the following trait defines an item `render`, perhaps you need to implement it:
candidate #1: `Render`

最佳答案

在实现链中存在差距:

impl<'a, T: Render> Render for &'a BTreeSet<T> {
// ....
}

impl<'a, A: Render> Render for (&'a A,) {
// ...
}

第一个 implreference BTreeSet 提供了 Render,而第二个提供了一个实现对实现 Render 的事物的引用的元组。由于 BTreeSet 本身没有实现 Render(只有对它的引用才实现!),编译器将拒绝工作。

在这种情况下,从引用中抽象出来更符合人体工程学,因为 Render 似乎适合对另一个 Render 值的任何引用。为所有引用 &T 实现此特征,其中 T: Render:

impl<'a, T> Render for &'a T
where
T: Render,
{
fn render(&self) {
(**self).render();
}
}

因此,其余的实现变得稍微简单了一些:

impl<T> Render for BTreeSet<T>
where
T: Render,
{
fn render(&self) {}
}

impl<A> Render for (A,)
where
A: Render,
{
fn render(&self) {
(&self.0).render();
}
}

Working Playground

另见:

关于rust - 在 Rust 的元组中输入匹配 BTreeSet 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52706314/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com