Limits

极值设置

limits.md
commit: 064e68d9f878d6e98e12776562fa9306ef851f10
本章译文最后维护日期:2021-10-17

以下属性影响部分编译期参数的极限值设置。

The recursion_limit attribute

recursion_limit属性

recursion_limit属性可以应用于 crate 级别,为可能无限递归的编译期操作(如宏扩展或自动解引用)设置最大递归深度。它使用 MetaNameValueStr元项属性句法来指定递归深度。

注意:rustc 中这个参数的默认值是128。

#![allow(unused)]
#![recursion_limit = "4"]

fn main() {
macro_rules! a {
    () => { a!(1); };
    (1) => { a!(2); };
    (2) => { a!(3); };
    (3) => { a!(4); };
    (4) => { };
}

// 这无法扩展,因为它需要大于4的递归深度。
a!{}
}
#![allow(unused)]
#![recursion_limit = "1"]

fn main() {
// 这里的失败是因为需要两个递归步骤来自动解引用
(|_: &u8| {})(&&&1);
}

The type_length_limit attribute

type_length_limit属性

type_length_limit属性限制在单态化过程中构造具体类型时所做的最大类型替换次数。它应用于 crate 级别,并使用 MetaNameValueStr元项属性句法来设置类型替换数量的上限。

注意:rustc 中这个参数的默认值是 1048576。

#![type_length_limit = "4"]

fn f<T>(x: T) {}

// 这里的编译失败是因为单态化 `f::<((((i32,), i32), i32), i32)>` 需要大于4个类型元素。
f(((((1,), 2), 3), 4));