FromSql :: from_sql参数的生存期是多少?

时间:2019-05-23 05:59:28

标签: rust rust-diesel

我正在将Diesel与Postgres结合使用,并想将text字段查询为*const str。 Diesel具有实现FromSql for *const str

文档描述:

  

返回的指针在生命周期内仅对from_sql的参数有效。

from_sql的有效期是多少?与连接的寿命相同吗?

1 个答案:

答案 0 :(得分:1)

from_sql将获取一个Option<&'a DB::RawValue>并返回一个Result<*const str>

没有原始指针(并且具有明确的生命周期),函数定义将类似于:

fn from_sql<'a>(bytes: Option<&'a DB::RawValue>) -> Result<&'a str>

输出到输入的生命周期在这里很明显,并且已经过静态检查-但是使用原始指针,不是:

fn from_sql<'a>(bytes: Option<&'a DB::RawValue>) -> Result<*const str>

警告只是指出,您所获得的指针仅在传递给函数的&'a DB::RawValue的生命周期内有效。如果没有原始指针,则警告是不必要的,因为编译器将保证&str的生存时间与引用的时间一样长。

这是from_sql的实现:

fn from_sql(bytes: Option<&DB::RawValue>) -> deserialize::Result<Self> {
    use std::str;
    let string = str::from_utf8(not_none!(bytes))?;
    Ok(string as *const _)
}

输出生存期取决于bytes参数的原因是str::from_utf8仅执行UTF-8验证并对bytes进行不安全的强制转换为&str -本质上,您只是将输入作为其他类型返回。 from_sql的结果只是指向您传递给它的相同数据的指针,因此该指针仅在输入数据有效的情况下才有效。