我正在尝试从静态值示例化一个结构。编译器说我正在创建一个临时值,但所有内容都是引用和静态的。我找到了this github issue,它看起来像我的问题。
struct OutputDescription {
name: &'static str,
}
struct SubOutput<T> {
sub_param_a: T,
}
struct Output {
param_a: SubOutput<bool>
}
impl <T: Description>Description for SubOutput<T> {
fn name() -> &'static str {
"param_a"
}
fn fields() -> &'static [OutputDescription] {
&[OutputDescription {
name: T::name(),
}]
}
}
trait Description {
fn name() -> &'static str;
fn fields() -> &'static [OutputDescription];
}
Compiling playground v0.0.1 (/playground)
error[E0515]: cannot return reference to temporary value
--> src/main.rs:19:9
|
19 | &[OutputDescription {
| _________^-
| |_________|
| ||
20 | || name: T::name(),
21 | || }]
| || ^
| ||__________|
| |__________returns a reference to data owned by the current function
| temporary value created here
For more information about this error, try `rustc --explain E0515`.
error: could not compile `playground` (bin "playground") due to previous error
Playground
我正在寻找一个修复或解决办法,如果这是一个编译器的问题。
2条答案
按热度按时间iqjalb3h1#
你不能在编译时调用trait函数,所以不可能通过调用trait函数来构造静态值。但是由于你的函数没有参数,你可以使用
const
s代替fn
s:当然,这禁止返回值不是常量的实现。
xzlaal3s2#
这
是一个临时的,如果它可以被提升为一个常量-因此,如果你可以采取一个静态引用它-取决于几个因素,调用一个函数,如
T::name
prevents it,因此,你不会得到常量提升,因此,你不能返回一个静态引用它。