gpt4 book ai didi

rust - 处理 std::borrow::Cow 的集合

转载 作者:行者123 更新时间:2023-11-29 08:25:06 24 4
gpt4 key购买 nike

我有这个设置:

use std::borrow::Cow;

fn encode_text<'a, T: Into<Cow<'a, str>>>(text: T) {}

fn encode_texts<'a, T: Into<Cow<'a, str>>>(texts: &[T]) {
for text in texts {
encode_text(text);
}
}

fn main() {
encode_texts(&vec!["foo", "bar"]);
}

我得到的错误是:

error[E0277]: the trait bound `std::borrow::Cow<'_, str>: std::convert::From<&T>` is not satisfied
--> src/main.rs:7:9
|
7 | encode_text(text);
| ^^^^^^^^^^^ the trait `std::convert::From<&T>` is not implemented for `std::borrow::Cow<'_, str>`
|
= help: consider adding a `where std::borrow::Cow<'_, str>: std::convert::From<&T>` bound
= note: required because of the requirements on the impl of `std::convert::Into<std::borrow::Cow<'_, str>>` for `&T`
note: required by `encode_text`
--> src/main.rs:3:1
|
3 | fn encode_text<'a, T: Into<Cow<'a, str>>>(text: T) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

这作为 T 是有意义的是 encode_text 的有效参数和 &T不是,但不知何故我无法让它发挥作用。我不能调用 encode_text(*text)因为我无法将其移出借用的内容(textsencode_texts 参数)。

我还没有添加 where std::borrow::Cow<'_, str>: std::convert::From<&T>因为它基本上表明我想要标准库类型 Cow实现From<&T> .如果情况并非如此,那么我添加约束将无济于事。

我被卡住了,找不到任何关于如何使用 Cow 的资源s 在集合或切片中。

最佳答案

您的代码不能成为通用的因为它在非通用的情况下不起作用。将具体类型替换为:

use std::borrow::Cow;

fn encode_text<'a, T: Into<Cow<'a, str>>>(text: T) {}

fn encode_texts(texts: &[&'static str]) {
for text in texts {
encode_text(text);
}
}

fn main() {
encode_texts(&["foo", "bar"]);
}
error[E0277]: the trait bound `std::borrow::Cow<'_, str>: std::convert::From<&&str>` is not satisfied
--> src/main.rs:7:9
|
7 | encode_text(text);
| ^^^^^^^^^^^ the trait `std::convert::From<&&str>` is not implemented for `std::borrow::Cow<'_, str>`
|
= help: the following implementations were found:
<std::borrow::Cow<'a, std::path::Path> as std::convert::From<&'a std::path::Path>>
<std::borrow::Cow<'a, std::path::Path> as std::convert::From<std::path::PathBuf>>
<std::borrow::Cow<'a, str> as std::convert::From<&'a str>>
<std::borrow::Cow<'a, [T]> as std::convert::From<&'a [T]>>
and 2 others
= note: required because of the requirements on the impl of `std::convert::Into<std::borrow::Cow<'_, str>>` for `&&str`
note: required by `encode_text`
--> src/main.rs:3:1
|
3 | fn encode_text<'a, T: Into<Cow<'a, str>>>(text: T) {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Cow 有一套限量 From实现:

impl<'a> From<&'a str> for Cow<'a, str> {}

impl<'a, T> From<&'a [T]> for Cow<'a, [T]>
where
T: Clone
{}

impl<'a, T> From<Vec<T>> for Cow<'a, [T]>
where
T: Clone,
{}

impl<'a> From<String> for Cow<'a, str> {}

&&str 转换不在列表中。从 &&str 取消引用一个级别是有一定意义的。会给你&str , 这在 Cow 中没有用.

相反,我将代码实现为采用任何迭代器,其中值可以转换为 Cow .然后,您需要在传入之前调整切片:

use std::borrow::Cow;

fn encode_text<'a, T>(_text: T)
where
T: Into<Cow<'a, str>>,
{}

fn encode_texts<'a, I>(texts: I)
where
I: IntoIterator,
I::Item: Into<Cow<'a, str>>,
{
for text in texts {
encode_text(text);
}
}

fn main() {
encode_texts(["foo", "bar"].iter().cloned());
}

关于rust - 处理 std::borrow::Cow 的集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49711836/

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