在许多情况下,我需要清除缓冲区区域或将切片设置为特定值。当地人推荐的方法是什么?
这是无效的Rust,但我想做类似的事情:
let mut some_buffer = vec![0u8; 100];
buffer[10..20].set(0xFF)
我可以使用for循环,但我觉得我错过了一些东西,因为我是Rust的新手。
在C++中,我会这样做:
std::array<int,6> foobar;
foobar.fill(5);
在Python中,它类似于:
tmp = np.zeros(10)
tmp[3:6]=2
2条答案
按热度按时间sqxo8psd1#
更新:现在有了slice::fill方法。
原文回答:
你这是本末倒置。你真的在乎它调用
memset
吗?我想不是,只是它很有效。Rust的一大吸引力在于编译器可以在构建时“丢弃”许多抽象。例如,当一些CPU指令将做同样的事情时,为什么要调用一个函数?正如kazemakase指出的,当set区域变得“足够大”时,优化器切换到使用
memset
,而不是内联指令:如果你愿意,你可以将这个函数 Package 在一个扩展trait中:
参见:
gkl3eglg2#
从2021年2月11日发布的Rust 1.50.0开始,
slice::fill
现在是稳定的,这意味着如果您更改函数名称,您的示例现在可以工作:将打印
[0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]