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