我发现了一种不寻常的行为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() };
}
Run Code Online (Sandbox Code Playgroud)
但是如果设置了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() };
}
Run Code Online (Sandbox Code Playgroud)
这是一个已知问题,我应该将其发布到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() }
}
}
Run Code Online (Sandbox Code Playgroud)
当你说A { ..Default::default() },你不是说" 为每个领域创造一个A并执行Default::default()".这意味着,执行default是不是等同于:
A { x: 1, y: Default::default() }
Run Code Online (Sandbox Code Playgroud)
事实上,这是:
let temp: A = Default::default();
temp.x = 1;
temp
Run Code Online (Sandbox Code Playgroud)
所以是的,它会导致堆栈溢出:您已经A根据自身定义了默认值.
| 归档时间: |
|
| 查看次数: |
328 次 |
| 最近记录: |