我发现 std::default
的异常行为.如果您使用默认 setter 创建嵌套结构并尝试使用默认参数创建最高级别的结构,则会导致堆栈溢出。
此代码可以编译,但当您尝试运行时它会抛出 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() };
}
但是如果你设置默认的inherited by 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)
.
最佳答案
当然它会导致堆栈溢出。
为了更清楚地说明这一点,让我们稍微改变一下示例:
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
的默认值。
关于rust - 在嵌套结构上实现默认值会导致堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30949498/