相关疑难解决方法(0)

是否可以在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
查看次数

是否可以创建一个计算扩展项目数量的宏?

是否可以创建一个计算扩展项目数量的宏?

macro_rules! count {
    ($($name:ident),*) => {
        pub enum Count {
           $(
               $name = 1 << $i // $i is the current expansion index
            ),*
        }
    }
}

count!(A, B, C);
Run Code Online (Sandbox Code Playgroud)

macros rust

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

如何计算 Rust 宏系统中的表达式?

我正在尝试通过编写一个简单的宏来学习 Rust 宏系统,该宏生成基于某些无符号整数类型(u8, u16, u32, u64)的结构。我想要这样的东西:

bitmessage! {
    struct Header(u16);
    version: 8, 5; // the first number is the length, second is value
    data: 8, 5;
}
Run Code Online (Sandbox Code Playgroud)

更具体地说,我正在寻找某种方法来将某些信息存储在具有各种偏移量的无符号整数类型中。一个用例是读取一些字节并构造某种“消息”:

bitmessage! {
    struct Header(u16);
    version: 8, 5; // the first number is the length, second is value
    data: 8, 5;
}
Run Code Online (Sandbox Code Playgroud)

消息的较高部分包含一些数据/信息,较低部分包含版本控制字段。(这只是一个玩具示例)。

这是我到目前为止的努力,但内部重复扩展无法编译:

macro_rules! bitmessage {
(struct $name:ident($n:ty); 
    $($field_name:ident: $length:expr, $value:expr;)*)  => {
         struct $name ($n);
         $($name.1 = $name.1 | $value << $length)*
    };
}
Run Code Online (Sandbox Code Playgroud)

一种解决方案可能是将相关字节存储在结构中,直接实现它(或使用特征)来获取适当的字段,但这会涉及太多的位移逻辑(这没有问题,但必须有更多)方便的方式)。

我知道 …

rust rust-macros

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

如何在包含长度由宏指定的数组的类型上使用#[derive]?

我有这个代码:

macro_rules! count {
    () => { 1 };
}

#[derive(Debug)]
struct MyStruct<T> {
    field_list: [T; count!()],
}
Run Code Online (Sandbox Code Playgroud)

编译器给出了这个错误:

error: `derive` cannot be used on items with type macros
 --> src/main.rs:7:21
  |
7 |     field_list: [T; count!()],
  |                     ^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

有没有办法#[derive]在包含数组的类型上使用,其中长度由宏指定?

macros rust

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

使用宏来初始化大量非复制元素

我正在尝试使用相同的初始化程序初始化大量元素.64个元素只是一个例子 - 我想让它至少达到16k.不幸的是简单

let array : [AllocatedMemory<u8>; 64] = [AllocatedMemory::<u8>{mem:&mut []};64];
Run Code Online (Sandbox Code Playgroud)

因为AllocatedMemory结构没有实现,所以不起作用Copy

error: the trait `core::marker::Copy` is not implemented for the type `AllocatedMemory<'_, u8>` [E0277]
let array : [AllocatedMemory<u8>; 64] = [AllocatedMemory::<u8>{mem:&mut []}; 64];
                                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用宏无济于事:

struct AllocatedMemory<'a, T: 'a> {
    mem: &'a mut [T],
}

macro_rules! init_memory_helper {
    (1, $T : ty) => { AllocatedMemory::<$T>{mem: &mut []} };
    (2, $T : ty) => { init_memory_helper!(1, $T), init_memory_helper!(1, $T) };
    (4, $T : ty) => { init_memory_helper!(2, …
Run Code Online (Sandbox Code Playgroud)

initializer-list static-initializer rust

3
推荐指数
1
解决办法
813
查看次数