Rust 特征中的等式约束。具有 Into<T> 特征的变体
Equality constraints in trait in Rust. Variant with Into<T> trait
我希望 ToKeyIter::Item 等于 ToKeyIter::KeyIter::Item,因为 KeyIter 应该实现 Iterator 特性。我做不到,因为 where 子句中有约束相等性。这就是为什么我决定使用 trait Into.
pub trait ToKeyIter {
type Item: Clone + Hash + Eq;
type KeyIter<'b>: Iterator where Self: 'b, <Self::KeyIter<'b> as Iterator>::Item: Into<Self::Item>;
fn key_iter<'a> (&'a self) -> Self::KeyIter<'a>
where <Self::KeyIter<'a> as Iterator>::Item: Into<Self::Item>;
}
trait 本身可以编译,但是当我尝试为 str 或 String 实现它时,编译器失败并显示“溢出评估需求”。
impl ToKeyIter for str {
type Item = char;
type KeyIter<'a> = Chars<'a>;
fn key_iter<'a> (&'a self) -> Chars<'a> {
self.chars()
}
}
impl ToKeyIter for String {
type Item = char;
type KeyIter<'a> = Chars<'a>;
fn key_iter<'a> (&'a self) -> Chars<'a> {
self.chars()
}
}
如果你能说出这样的东西怎么写
Key::Item == Key::KeyIter::Item
会很棒的。但我也想知道我应该怎么做才能正确实现具有 Into 特征的 str 和 String。
您可以指定Iterate<Item=Self::Item>
来获得您想要的。请参阅 the playground 了解此内容的实时版本:
#![feature(generic_associated_types)]
use std::hash::Hash;
use std::str::Chars;
pub trait ToKeyIter {
type Item: Clone + Hash + Eq;
type KeyIter<'a>: Iterator<Item=Self::Item>
where
Self: 'a;
fn key_iter<'a>(&'a self) -> Self::KeyIter<'a>;
}
impl ToKeyIter for str {
type Item = char;
type KeyIter<'a> = Chars<'a>;
fn key_iter<'a> (&'a self) -> Chars<'a> {
self.chars()
}
}
impl ToKeyIter for String {
type Item = char;
type KeyIter<'a> = Chars<'a>;
fn key_iter<'a> (&'a self) -> Chars<'a> {
self.chars()
}
}
我希望 ToKeyIter::Item 等于 ToKeyIter::KeyIter::Item,因为 KeyIter 应该实现 Iterator 特性。我做不到,因为 where 子句中有约束相等性。这就是为什么我决定使用 trait Into.
pub trait ToKeyIter {
type Item: Clone + Hash + Eq;
type KeyIter<'b>: Iterator where Self: 'b, <Self::KeyIter<'b> as Iterator>::Item: Into<Self::Item>;
fn key_iter<'a> (&'a self) -> Self::KeyIter<'a>
where <Self::KeyIter<'a> as Iterator>::Item: Into<Self::Item>;
}
trait 本身可以编译,但是当我尝试为 str 或 String 实现它时,编译器失败并显示“溢出评估需求”。
impl ToKeyIter for str {
type Item = char;
type KeyIter<'a> = Chars<'a>;
fn key_iter<'a> (&'a self) -> Chars<'a> {
self.chars()
}
}
impl ToKeyIter for String {
type Item = char;
type KeyIter<'a> = Chars<'a>;
fn key_iter<'a> (&'a self) -> Chars<'a> {
self.chars()
}
}
如果你能说出这样的东西怎么写
Key::Item == Key::KeyIter::Item
会很棒的。但我也想知道我应该怎么做才能正确实现具有 Into 特征的 str 和 String。
您可以指定Iterate<Item=Self::Item>
来获得您想要的。请参阅 the playground 了解此内容的实时版本:
#![feature(generic_associated_types)]
use std::hash::Hash;
use std::str::Chars;
pub trait ToKeyIter {
type Item: Clone + Hash + Eq;
type KeyIter<'a>: Iterator<Item=Self::Item>
where
Self: 'a;
fn key_iter<'a>(&'a self) -> Self::KeyIter<'a>;
}
impl ToKeyIter for str {
type Item = char;
type KeyIter<'a> = Chars<'a>;
fn key_iter<'a> (&'a self) -> Chars<'a> {
self.chars()
}
}
impl ToKeyIter for String {
type Item = char;
type KeyIter<'a> = Chars<'a>;
fn key_iter<'a> (&'a self) -> Chars<'a> {
self.chars()
}
}