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

标签 rust default

我发现 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/

相关文章:

rust - 了解此Rust借入/指针示例

rust - UdpSocket.recv_from 失败并显示 "end of file",但我可以在 Wireshark 中看到传入的包

rust - 在 Rust 中处理传递参数时的经验法则是什么?

json - 使用 Serde 将两种类型转换为一种类型

haskell - GHCi 是否不应用默认声明来解决类型歧义?

c++ - 类不存在默认构造函数但未默认传递

rust - 如何选择或加入不同类型的 future ?

c# - 是否可以将默认引用分配给 Unity 中的非 MonoBehaviour 类

web-applications - tomcat中的默认网络应用程序

mercurial - 将 --keep-changes 设置为 `hg qpush` 和 `hg qpop` 的默认值