Rust get法在后期锈蚀中的使用寿命

Rust get法在后期锈蚀中的使用寿命,rust,lifetime,borrow-checker,Rust,Lifetime,Borrow Checker,一些背景(可以跳过): 我对Rust很陌生,我来自Haskell的背景(以防万一,这会让你知道我可能有什么误解) 我正在尝试编写一个程序,在给定数据库的一系列输入的情况下,可以创建可定制的报告。为此,我想创建一个字段数据类型,它可以以某种DSL风格进行组合。在Haskell中,我的直觉是将字段作为函子和应用程序的一个实例,这样就可以编写这样的东西: type Env=[String] 类型行=[字符串] 数据字段a=字段 {fieldParse::Env->Row->a} 实例函子字段,其中 f

一些背景(可以跳过):

我对Rust很陌生,我来自Haskell的背景(以防万一,这会让你知道我可能有什么误解)

我正在尝试编写一个程序,在给定数据库的一系列输入的情况下,可以创建可定制的报告。为此,我想创建一个
字段
数据类型,它可以以某种DSL风格进行组合。在Haskell中,我的直觉是将
字段
作为
函子
应用程序的一个实例,这样就可以编写这样的东西:

type Env=[String]
类型行=[字符串]
数据字段a=字段
{fieldParse::Env->Row->a}
实例函子字段,其中
fmap f a=字段$
\环境行->f$fieldParse环境行
实例应用程序字段,其中
纯=场。康斯特。常数
fa fb=字段$
\环境行->(fieldParse fa)环境行
$(fieldParse fb)环境行
oneField::fieldint
一个字段=纯1
twoField::Field Int
twoField=fmap(*2)一个字段
tripleField::Field(Int->Int)
三重场=纯(*3)
三字段::字段Int
三字段=三字段一字段
实际问题:

我知道在Rust中实现
Functor
Applicative
traits是非常困难的,所以我只是为
字段
实现了适当的函数,而不是实际定义traits(这一切都很好)。这是Rust中
字段
的一个非常简化的实现,没有任何
Functor
Applicative
东西

使用std::result;
使用postgres::Row;
使用postgres::types::FromSql;
类型Env=Vec;

键入FieldFunction。

所以我似乎已经修复了它,尽管我仍然不确定我是否完全理解我所做的

类型FieldFunction Result>;
结构域
}
fn字段\u bad>(输入:u32)->字段更高级别的特征边界
我不熟悉正在使用的postgresql板条箱,因此我无法就代码所采用的方法提供任何一般性指导

但是无论如何,在当前的实现中,坚持生命周期的直接问题,更高级别的trait界限可能是可行的。我需要一个工作示例来证实这一点

这对我来说是新的。我试用了您的代码,得到了一些有趣的错误消息,表明在声明边界时使用了
for
。这给我带来了铁锈参考

所以我试了一下,它编译了

fn field_bad<A>(input: u32) -> Field<A> 
where A: for<'a> FromSql<'a>
{
    let f = Box::new(move |_: &Env, row: &Row| {
        Ok(row.get(input as usize))
    });

    Field { field_parse: f }
}
fn field\u bad谈论HRTB

这是关于生命周期和更高等级的特质界限是如何不同的


看起来这里发生的是
field\u bad()
没有从SQL
实例返回任何
——直接或间接地通过
field
FromSql
只是
Ok(T)
闭包返回类型的一部分,它作为
field
中的一个字段存在。因此,
语法允许我们提供应用于调用闭包时将返回的类型的生存期。

确实编译了,谢谢!我不想假装我明白为什么,但我会给你链接的其他文档读一读,希望它会有意义。好吧,读了你在HRTBs上喜欢的文章后,我想我开始明白(某种程度上)发生了什么。@JamesBurton你能用这种方法让你的代码工作吗?顺便说一句,我不认为这对我来说有什么意义,直到我阅读了我链接的每个参考的部分。代码编译,但我不能确认它100%的工作预期,直到我整理了一些其他事情,但我一定会留下一个更新在这里。我可以确认代码按要求运行。