相关疑难解决方法(0)

为什么我不能使用函数返回编译时常量作为常量?

let arr0 = [0u8; 15];
let arr1 = [0u8; arr0.len()]; // this fails
Run Code Online (Sandbox Code Playgroud)

我认为编译器应该能够将arr0的长度确定为编译时常量,不是吗?仍然将此标记为错误,表示找到变量而不是常量整数.

  1. 为什么?
  2. Rust中有constexpr(C++)函数吗?

版:

rustc 1.0.0-nightly (ecf8c64e1 2015-03-21) (built 2015-03-22)
Run Code Online (Sandbox Code Playgroud)

rust

8
推荐指数
1
解决办法
1231
查看次数

是否可以在Rust的编译时计算一个递归函数?

我想计算一个的阶乘const。我想结束这样的事情:

const N: usize = 4;
const N_PERMUTATIONS = factorial(N);
Run Code Online (Sandbox Code Playgroud)

显而易见的解决方案(不起作用)是:

  • const fn–不允许(或至少不实施)条件语句const fn,以下任何一种都不会编译:

    const fn factorial(n: usize) -> usize {
        match n {
            0 => 1,
            _ => n * factorial(n-1)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
    const fn factorial(n: usize) -> usize {
        if n == 0 {
            1
        } else {
            n * factorial(n-1)
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 宏–在所有宏扩展之后执行表达式的评估。此宏将永远不会达到基本情况,因为经过四次迭代后,参数为4-1-1-1-1,与以下参数不匹配0

    macro_rules!factorial {
        (0) => (1);
        ($n:expr) => ($n * factorial($n-1));
    }
    
    Run Code Online (Sandbox Code Playgroud)

我还尝试了以下方法,如果*进行了短路评估,该方法将起作用,但是按原样进行无条件递归会导致堆栈溢出:

const …
Run Code Online (Sandbox Code Playgroud)

macros recursion const compile-time-constant rust

6
推荐指数
1
解决办法
477
查看次数

使用AtomicUsize :: new时,const fns是一个不稳定的特性

这段代码有什么问题?

use std::sync::atomic::AtomicUsize;

static mut counter: AtomicUsize = AtomicUsize::new(0);

fn main() {}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

error: const fns are an unstable feature
 --> src/main.rs:3:35
  |>
3 |> static mut counter: AtomicUsize = AtomicUsize::new(0);
  |>                                   ^^^^^^^^^^^^^^^^^^^
help: in Nightly builds, add `#![feature(const_fn)]` to the crate attributes to enable
Run Code Online (Sandbox Code Playgroud)

文档提到其他原子int大小不稳定,但AtomicUsize显然是稳定的.

这样做的目的是获得一个原子每进程计数器.

compiler-errors atomic rust

5
推荐指数
1
解决办法
455
查看次数