如何处理第三方结构体的“未找到名为'clone'的方法”

How to deal with "no method named `clone` found" for third-party struct

提问人:user3353185 提问时间:10/23/2023 最后编辑:cafce25user3353185 更新时间:10/25/2023 访问量:88

问:

我是 Rust 的新手,正在尝试使用以下代码中创建的值两次:response

    let response = reqwest::blocking::get(
    "https://www.imdb.com/search/title/?groups=top_100&sort=user_rating,desc&count=100"
    ).unwrap();
    r = response.clone(); // <- ERROR
    let response_text = response
    .text()
    .unwrap();

如果我分配给我,我就会失去对它的访问权限。因此,我首先尝试将其克隆到另一个变量中。但是,我收到一个错误说.responseresponse_textno method named `clone` found for struct `reqwest::blocking::Response` in the current scope

如何解决此问题?搜索此问题的大多数结果都建议我创建自己的结构,将结构嵌入其中,然后手动实现一个特征。当然,一定有一种更简单的方法(我希望)!Response.clone()

Rust 借用检查器

评论

1赞 cafce25 10/23/2023
好吧,如果您提出的解决方案是可行的,您可以直接使用该实现,而无需包装结构,不幸的是,这是不可能的。另请参阅此关于响应测试的问答Clone
6赞 isaactfa 10/23/2023
这似乎有点 XY 问题。 使用响应,但大多数其他方法仅通过引用获取它。如果您之前调用过这些,则无需一开始就克隆它。.text()Response.text()
2赞 cafce25 10/23/2023
@user3353185这在(库作者)的设计上是不可能的。例如,响应可能只流式传输正文,并且可能无法读取两次或类似的东西。
3赞 Jared Smith 10/23/2023
“在大多数其他语言中如何做到这一点是显而易见的”,是的,因为其他语言要么要求您跟踪与响应(C / C++)关联的内存的分配和释放,要么有一个垃圾回收器为您执行此任务(基本上是其他所有任务)。让编译器为您执行此任务(而不是自己执行或支付运行时税)的权衡是,您必须关心操作的顺序。如果你不再试图强迫 Rust 进入熟悉的模式和语言的代码,你会有一段轻松的时光。
3赞 isaactfa 10/23/2023
@user3353185如果你想学习这门语言,我认为最好理解它的语义,而不是试图在第一个障碍中绕过它们。您无法克隆 a,因为它拥有只能读取一次的流。如果您需要克隆该数据,您可以将其从(例如使用)中取出并克隆它。ResponseResponse.text()

答:

0赞 user3353185 10/25/2023 #1

我发现最有用的答案来自@isaactfa的评论,我在这里逐字复制:

  • 您无法克隆响应,因为它拥有只能读取一次的流。如果您需要克隆该数据,您可以将其从响应中获取(例如使用 .text())并克隆它。