- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 TOML 文档实现可链接的查询执行。
A Query
是更改 TOML 文档并可能返回另一个 Query
的东西应在其自身之后执行的对象。 Query
执行的获取前一个查询的结果(如果有的话)。
问题在于返回类型是通用的。查询可能会返回 Vec<i64>
, 但它的继任者可能会返回 String
...因此,一个 Query
的返回类型直接取决于其后继者的返回类型。
到目前为止,这是我的代码:
extern crate either;
extern crate toml;
use either::Either;
use toml::Value;
type Result<T> = ::std::result::Result<T, ()>; // for simplicity
pub trait Query<Prev>
where
Prev: Sized,
Self: Sized,
{
type Output: Sized;
type Next: Query<Self::Output>;
fn execute(&self, target: &mut Value, prev_result: Option<Prev>) -> Result<Self::Output>;
fn next(self) -> Option<Self::Next>;
}
fn execute_query<Q, Prev>(
doc: &mut Value,
query: &Q,
prev_result: Option<Prev>,
) -> Result<Either<Q::Output, <Q::Next as Query<Q::Output>>::Output>>
where
Q: Query<Prev>,
{
let result = query.execute(doc, prev_result)?;
if let Some(next_query) = query.next() {
let next_result: <Q::Next as Query<Q::Output>>::Output =
match execute_query(doc, &next_query, Some(result)) {
Ok(Either::Left(t)) => t,
Ok(Either::Right(t)) => return Ok(Either::Right(t)), // error happens here
Err(e) => return Err(e),
};
Ok(Either::Right(next_result))
} else {
Ok(Either::Left(result))
}
}
( playground )
错误是返回类型是递归的(因为整个问题都是递归的):
error[E0308]: mismatched types
--> src/main.rs:37:65
|
37 | Ok(Either::Right(t)) => return Ok(Either::Right(t)), // error happens here
| ^ expected type parameter, found associated type
|
= note: expected type `<<Q as Query<Prev>>::Next as Query<<Q as Query<Prev>>::Output>>::Output`
found type `<<<Q as Query<Prev>>::Next as Query<<Q as Query<Prev>>::Output>>::Next as Query<<<Q as Query<Prev>>::Next as Query<<Q as Query<Prev>>::Output>>::Output>>::Output`
标题不是很有表现力。对此我感到很抱歉,我不知道如何更好地描述。
最佳答案
解决问题的整个方法是错误的。我通过以下方式实现了它:
Query
特性提供了一个链接查询的功能。该函数返回一个 Chain
。Chain
类型通过执行第一个元素并将结果(如果Ok
)传递给第二个查询来实现Query
。使用这个问题可以解决:
use std::marker::PhantomData;
use toml::Value;
use error::Result;
pub trait Query<Prev>
where
Prev: Sized,
Self: Sized,
{
type Output: Sized;
fn execute(&self, target: &mut Value, prev_result: Option<Prev>) -> Result<Self::Output>;
fn chain<Q>(self, other: Q) -> Chain<Self, Prev, Q>
where
Q: Query<Self::Output>,
{
Chain {
first: self,
_p: PhantomData,
second: other,
}
}
}
pub struct Chain<A, P, B>
where
A: Query<P>,
B: Query<A::Output>,
P: Sized,
{
first: A,
_p: PhantomData<P>,
second: B,
}
impl<A, P, B> Query<P> for Chain<A, P, B>
where
A: Query<P>,
B: Query<A::Output>,
P: Sized,
{
type Output = B::Output;
fn execute(&self, target: &mut Value, prev_result: Option<P>) -> Result<Self::Output> {
let p = self.first.execute(target, prev_result)?;
self.second.execute(target, Some(p))
}
}
pub trait QueryExecutor {
fn query<Q, T>(&mut self, q: &Q) -> Result<Q::Output>
where
Q: Query<T>;
}
impl QueryExecutor for Value {
fn query<Q, T>(&mut self, q: &Q) -> Result<Q::Output>
where
Q: Query<T>,
{
q.execute(self, None as Option<T>)
}
}
(包括测试的完整代码 here )
关于generics - TOML 文档的可链接查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48306882/
我有一个 TOML 文档,其中某些键可能存在也可能不存在。例如。该文件是有效文件: foo = "bar" 但这也是有效的: foo = "bar" something = "else" 我现在正尝试
我正在使用 Dynaconf (3.1.2) 来处理我的 python 应用程序设置。 如果我在 settings.toml 和 .secrets.toml 中使用相同的 key ,则这些部分最后仅包
我正在使用 Dynaconf (3.1.2) 来处理我的 python 应用程序设置。 如果我在 settings.toml 和 .secrets.toml 中使用相同的 key ,则这些部分最后仅包
TOML said“TOML和YAML都强调人类的可读性,例如使人们更容易理解给定行目的的注释。TOML的不同之处在于将它们组合在一起,允许注释(与JSON不同),但保留了简单性(与YAML不同)。”
我正在尝试为 TOML 文档实现可链接的查询执行。 A Query是更改 TOML 文档并可能返回另一个 Query 的东西应在其自身之后执行的对象。 Query执行的获取前一个查询的结果(如果有的话
看着 toml repo ,我没有看到任何关于键命名约定的限制/建议 看起来大部分变量都是 lowercase但想知道 key 的最佳实践 - 命名约定是什么? 假设我想要一个名为 firstname
我想从 TOML 文件生成 JSON。 JSON 结构应该是这样的,在对象数组中包含对象数组: { "things": [ { "a": "thing1
背景 我正要尝试从GitHub下载的Python包,发现它没有setup.py ,所以我无法安装它 pip install -e 相反,该软件包具有 pyproject.toml 文件似乎具有与 s
获取以下 TOML 数据: [[items]] foo = 10 bar = 100 [[items]] foo = 12 bar = 144 还有下面的 rust 代码: use serde_der
“WSO IS 5.9.0”的新功能是 deployment.toml ,但我还没有找到配置选项,也没有找到如何从这个文件设置 xml 配置文件的方法。 例如,如果我想在 carbon.xml 中启用
“WSO IS 5.9.0”的新功能是 deployment.toml ,但我还没有找到配置选项,也没有找到如何从这个文件设置 xml 配置文件的方法。 例如,如果我想在 carbon.xml 中启用
从 toml 文件中读取的字符串值包含额外的引号: # Toml file string_key = "fdsafdsafdsfds" 代码: let cfg_file_content = g
我正在尝试读取 TOML 文件以创建一个结构,该结构包含具有关联值的枚举向量。这是示例代码: extern crate serde; #[macro_use] extern crate serde_d
我有共享公共(public)资源且无法同时执行的测试。这些测试因 cargo test 而失败,但适用于 RUST_TEST_THREADS=1 cargo test。 我可以修改测试以等待全局互斥锁
我使用以下方式安装了依赖项: go get github.com/BurntSushi/toml 我在与 main.go 相同的文件夹中创建了一个 toml 文件: . |-- cloud.toml
我有一个包含两个可执行文件的 Rust 项目: src └── bin ├── app.rs └── tool.rs tool 程序作为app 的子进程运行。 (需要进行分离,因为 t
背景 我目前正在编写一个绑定(bind) C 库的 crate ,我需要用户指定构建库的位置。以前,我见过 llvm-sys 的句柄crate 使用环境变量。但是,如果我经常使用它,每次我想运行一个项
所以我在 GitHub 存储库中有几个文件,我想设置一个自定义的 404 错误页面。当我搜索它时,它要求我在 netlify.toml 中插入一些东西。文件,它应该在我的根目录中(我认为这意味着存储库
Pip 支持 pyproject.toml文件,但到目前为止,新模式的所有实际使用都需要一个 3rd 方工具来自动生成这些文件(例如,诗歌和 pip)。不像 setup.py这已经是人类可写的,pyp
我希望有这样的东西:cargo install stopwatch 但在文档中找不到它。 查找包版本并手动将包添加到.toml: [dependencies] stopwatch="0.0.6" 感觉
我是一名优秀的程序员,十分优秀!