小编dco*_*les的帖子

Rust 中有链接 Option 的惯用方法吗?

当反序列化深层嵌套结构(例如,从 JSON)时,必须遍历多种Option类型的情况并不少见。

例如:

let foo = Foo {
    x: Some(Bar {
        y: Some(Baz {
            z: Some(42),
        })
    })
};
Run Code Online (Sandbox Code Playgroud)

是否有一种惯用的方式来链接 Option 来访问深度嵌套的值?

到目前为止,我有以下内容,但都不像foo.x?.y?.z支持可选链的其他语言那样简洁:

let z = foo.x.as_ref().and_then(|x| x.y.as_ref()).and_then(|y| y.z);
let z = foo.x.as_ref().and_then(|x| x.y.as_ref()?.z);
let z = (|| foo.x.as_ref()?.y.as_ref()?.z)();
Run Code Online (Sandbox Code Playgroud)

看起来这个try_block功能可能很合适,但目前还不稳定。

let z = try { foo.x.as_ref()?.y.as_ref()?.z };
Run Code Online (Sandbox Code Playgroud)

rust optional-chaining

11
推荐指数
1
解决办法
1960
查看次数

加载GCC向量扩展的数据

GCC的向量扩展提供了一种不错的,合理的可移植方式,可以访问不同硬件架构上的某些SIMD指令,而无需借助硬件特定的内在函数(或自动向量化).

一个真实的用例,就是计算一个简单的加法校验和.有一点不明确的是如何将数据安全地加载到矢量中.

typedef char v16qi __attribute__ ((vector_size(16)));

static uint8_t checksum(uint8_t *buf, size_t size)
{
    assert(size%16 == 0);
    uint8_t sum = 0;

    vec16qi vec = {0};
    for (size_t i=0; i<(size/16); i++)
    {
        // XXX: Yuck! Is there a better way?
        vec += *((v16qi*) buf+i*16);
    }

    // Sum up the vector
    sum = vec[0] + vec[1] + vec[2] + vec[3] + vec[4] + vec[5] + vec[6] + vec[7] + vec[8] + vec[9] + vec[10] + vec[11] + vec[12] …
Run Code Online (Sandbox Code Playgroud)

gcc checksum simd vectorization

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

如何在 Rust 编译时确定数组的大小?

我有一个 C 库,它需要明确定义字符串长度的字符串类型:

#[repr(C)]
pub struct FFIStr {
    len: usize,
    data: *const u8,
}
Run Code Online (Sandbox Code Playgroud)

因为这种类型被用作静态类型,所以我想要一种使用 const 函数或宏(而不是手动设置len)安全地声明它的方法。

我的第一次尝试是使用宏len(),但是在1.39.0 之前的版本中,不可能将切片长度作为 const fn 获取

macro_rules! ffi_string {
    ($x:expr) => {
        FFIStr { len: $x.len(), data: $x as *const u8 }
    };
}

#[no_mangle]
pub static mut HELLO_WORLD: FFIStr = ffi_string!(b"Hello, world!");
Run Code Online (Sandbox Code Playgroud)

error: core::slice::<impl [T]>::len` is not yet stable as a const function

我的第二次尝试是使用std::mem::size_of<T>,但似乎没有办法在不使用泛型的情况下获取静态数组的类型:

const fn ffi_string<T>(s: &'static T) -> FFIStr …
Run Code Online (Sandbox Code Playgroud)

arrays static compile-time-constant rust

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