我发现了std::default
的异常行为。如果使用默认设置器创建嵌套结构并尝试使用默认参数创建最高级别的结构,则会导致堆栈溢出。
此代码编译,但是当您尝试运行它时会抛出thread '<main>' has overflowed its stack
:
use std::default;
pub struct A {
x: i32
}
impl Default for A {
fn default() -> A {
A { ..Default::default() }
}
}
fn main() {
let test = A { ..Default::default() };
}
但是如果设置了props继承的默认值,它就可以工作:
use std::default;
pub struct A {
x: i32
}
impl Default for A {
fn default() -> A {
A { x: 0 }
}
}
fn main() {
let test = A { ..Default::default() };
}
这是一个已知问题,我应该将其发布到Rust问题跟踪器吗?我的编译器版本是rustc 1.2.0-nightly (0250ff9a5 2015-06-17)
。
答案 0 :(得分:5)
当然会导致堆栈溢出。
为了更清楚,让我们稍微改变一下这个例子:
pub struct A {
x: i32,
y: i32,
}
impl Default for A {
fn default() -> A {
A { x: 1, ..Default::default() }
}
}
当您说A { ..Default::default() }
时,您不说“为我创建A
并为每个字段执行Default::default()
”。这意味着default
的实施不等同于:
A { x: 1, y: Default::default() }
事实上,这是:
let temp: A = Default::default();
temp.x = 1;
temp
所以是的,它会导致堆栈溢出:你已经根据自己定义了A
的默认值。