Rust中值与引用比较的惯用实现方法是什么?
Rust中值与引用比较的惯用方式
先看这段意图判断3字节字符串是否等于b"foo"的Rust函数:
fn is_foo(value: [u8; 3]) -> bool { value == b"foo" }
这段代码无法编译,编译器报错:
error[E0277]: can't compare
[u8; 3]with&[u8; 3]
编译器明确指出不能直接将[u8; 3]类型的值和&[u8; 3]类型的引用做比较。目前能实现正确比较的两种写法是:
- 将值转为引用:
&value == b"foo" - 将引用解引用为值:
value == *b"foo"
从C++背景(值与引用几乎等价)出发,会觉得这两种写法都有些别扭,那Rust里比较值与引用的最惯用方式是什么?
在Rust的惯用写法里,更推荐使用&value == b"foo"这种将值转为引用的方式,原因如下:
- 性能更优:解引用字符串字面量
*b"foo"会触发数组的拷贝操作,而取value的引用&value只是创建一个指向原数据的引用,没有任何拷贝开销,效率更高。 - 语法更统一:Rust中很多标准库API(比如集合的
contains方法)都接受引用类型作为参数,使用引用进行比较能和这类场景的写法保持一致,让代码风格更连贯。
需要注意的是,Rust中引用和值的语义差异远大于C++:Rust的引用是严格的借用指针,带有明确的生命周期约束;而C++的引用更接近变量的别名,这也是两者写法不同的核心原因。
内容的提问来源于stack exchange,提问作者Daniel Wolf
相关产品推荐
相关产品推荐

