使用lazy_static定义的reqwest::Url为何未实现PolyfillTryInto trait?
问题原因与修复方案
问题根源
你碰到的这个编译错误,本质是类型不匹配:lazy_static!宏生成的SID_URI并不是直接的reqwest::Url类型,而是一个lazy_static::lazy_static::Static<reqwest::Url>的包装类型。而reqwest::Client::post()方法要求参数实现IntoUrl trait,这个包装类型并没有实现对应的trait,所以编译器才会抛出这个看起来有点迷惑的错误提示。
修复方法
只需要在使用SID_URI的时候,把内部实际的reqwest::Url值取出来就行,有两种简单的方式:
方式一:直接解引用
利用Static类型实现的Deref trait,用*符号解引用获取内部值:
let q = client.post(*SID_URI).form(¶ms).send()?;
方式二:调用as_ref()方法
Static类型也实现了AsRef<T> trait,通过as_ref()可以直接获取内部值的引用:
let q = client.post(SID_URI.as_ref()).form(¶ms).send()?;
补充说明
lazy_static!的作用是延迟初始化静态变量,它会为你的变量生成一个线程安全的包装类型,这个类型会在第一次访问时完成初始化。虽然它对外表现得像是你定义的reqwest::Url,但编译时的实际类型是包装后的Static,这就是为什么会出现这个看似奇怪的trait未实现错误。
内容的提问来源于stack exchange,提问作者Fredrick Brennan
相关产品推荐
相关产品推荐

