当反序列化深层嵌套结构(例如,从 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) 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) 我有一个 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)