我正在将Diesel与Postgres结合使用,并想将text
字段查询为*const str
。 Diesel具有实现FromSql
for *const str
。
文档描述:
返回的指针在生命周期内仅对
from_sql
的参数有效。
from_sql
的有效期是多少?与连接的寿命相同吗?
答案 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
的结果只是指向您传递给它的相同数据的指针,因此该指针仅在输入数据有效的情况下才有效。