[英]Add Clone to a rust liquid template
我正在关注这里的教程潮汐。 直到我们必须向请求添加状态为止,这一切都有效。 我收到一个错误,即Template
(来自处于潮汐状态的液体模板)没有实现Clone
。 新版本的tide 需要 state 来实现Clone
。 我尝试实现一个,但它说我不允许为导入的东西实现特征。 如何解决这个问题? 我是 Rust 的新手(第一天)。
我猜我应该创建一个指向Template
的包装器,并在其上实现一个浅克隆? 但我不知道如何“生锈地”做到这一点,无论这是正确的方法,还是我会遇到所有权问题。
代码:
use async_std::fs::read_to_string;
use liquid::{Object, Template};
use std::{clone::Clone, error::Error, str::FromStr, collections::HashMap};
use tide::{http::Mime, Response, StatusCode, Request};
pub type TemplateMap = HashMap<String, Template>;
#[derive(Clone)]
struct State {
templates: TemplateMap,
}
错误:
error[E0277]: the trait bound `liquid::Template: std::clone::Clone` is not satisfied
--> src/main.rs:11:5
|
11 | templates: TemplateMap,
| ^^^^^^^^^^^^^^^^^^^^^^ expected an implementor of trait `std::clone::Clone`
|
= note: required because of the requirements on the impl of `std::clone::Clone` for `std::collections::HashMap<std::string::String, liquid::Template>`
= note: required by `std::clone::Clone::clone`
= note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
是的,这是 Rust 中一个众所周知的烦恼。 程序员不能为他不拥有的类型实现特征,或者更确切地说,不能为定义类型或定义各自特征的 crate 之外的类型实现特征——这是为了确保没有两个相互竞争的实现可能会存在相同类型的问题,这可能会导致问题。
常见的解决方案确实是您建议的不优雅的解决方案:将类型包装为“newtype”,本质上创建一个仅包含此类型的结构,从而创建了一个在运行时相同的新类型,并为您自己的类型实现它。
这很可能会在您的代码中涉及一些额外的间接访问以访问所包含的类型,并且可能会涉及一些样板文件被重做,但请放心,这不会对生成的代码产生影响,并且所有这些都是零操作。
您可以在此处阅读有关trait 孤儿规则的更多信息。
liquid::Template
包装了一个Vec<Box<Renderable>>
这使得克隆变得困难 atm,直接在板条箱中或通过 newtype。 一个好的短期解决方法是用Arc
包装它,它为任何类型提供浅克隆。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.