在嵌套结构上实现默认值会导致堆栈溢出

Implementing Default on nested structures causes a stack overflow

我发现了 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() };
}

但是如果你设置默认的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() };
}

这是一个已知问题吗?我应该 post 它到 Rust 问题跟踪器吗?我的编译器版本是 rustc 1.2.0-nightly (0250ff9a5 2015-06-17)

Of 当然它会导致堆栈溢出。

为了更清楚地说明这一点,让我们稍微改变一下示例:

pub struct A {
    x: i32,
    y: i32,
}

impl Default for A {
    fn default() -> A {
        A { x: 1, ..Default::default() }
    }
}

当你说 A { ..Default::default() } 时,你 并不是 在说 "create me an A and execute Default::default() for each field"。这意味着 default 的实现是 而不是 等同于:

A { x: 1, y: Default::default() }

实际上是这样的:

let temp: A = Default::default();
temp.x = 1;
temp

所以是的,它会导致堆栈溢出:您已经根据自身定义了 A 的默认值。