我将 Diesel 与 Postgres 一起使用,并希望将text
字段查询为*const str
. Diesel 实现FromSql
了*const str
.
该文档描述:
返回的指针仅在 的参数的生命周期内有效
from_sql
。
的论点的寿命是from_sql
多少?它与连接的生命周期相同吗?
我将 Diesel 与 Postgres 一起使用,并希望将text
字段查询为*const str
. Diesel 实现FromSql
了*const str
.
该文档描述:
返回的指针仅在 的参数的生命周期内有效
from_sql
。
的论点的寿命是from_sql
多少?它与连接的生命周期相同吗?
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
只是指向您传递给它的相同数据的指针,因此该指针仅在输入数据有效时才有效。