2

我将 Diesel 与 Postgres 一起使用,并希望将text字段查询为*const str. Diesel 实现FromSql*const str.

该文档描述:

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

的论点的寿命是from_sql多少?它与连接的生命周期相同吗?

4

1 回答 1

1

from_sql将取 aOption<&'a DB::RawValue>并返回 a 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您传递给函数的生命周期内有效。如果没有原始指针,警告将是不必要的,因为编译器会保证 a&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 验证并对 an 进行不安全的强制bytes转换&str- 您实际上只是将输入作为不同的类型返回。的结果from_sql只是指向您传递给它的相同数据的指针,因此该指针仅在输入数据有效时才有效。

于 2019-05-23T14:34:26.787 回答