给定以下条件:
/// Zero Sized Type
struct ZST;
/// What the ZST converts into
const TEXT: &str = "target text";
下面的代码片段做同样的事情,至少在表面上是这样的:
// static impl
impl From<ZST> for &'static str {
fn from(_: ZST) -> &'static str {
TEXT
}
}
// generic impl
impl<'a> From<ZST> for &'a str {
fn from(_: ZST) -> &'a str {
TEXT
}
}
我的问题是:- 他们就是吗?是一样的吗?如果不是,又有什么区别呢?
- 哪个版本需要更多时间来编译?
由于引用是不可变的且处于返回位置,因此它们是相同的。也就是说,您可以将&'static str
分配给需要&'a str
的变量,对于任何生命周期'a
。同样,这两个变量都可以赋值给需要较短生存期的变量,因为具有较长生存期的引用是子类型。
实际上,实现impl<'a> From<ZST> for &'a str
的唯一可能的方法是返回一个静态。这是因为它必须适用于任何'a
,而满足这一条件的生命周期只有'static
。
至于编译时间的差异,它永远不会大到值得担心的程度。