看看这段代码:
let some_number: usize = 5;
let some_string = "abc".repeat(&some_number);
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:
预期
usize,发现&usize
我想知道,是否有任何理由要求repeat重复次数具有自有价值?如果我理解正确,如果repeat需要引用,我可以同时传递some_number(Rust 会自动传递引用)或&some_number. 对于程序员来说,体验会更好。
第一的,
如果
repeat需要引用,我可以同时传递some_number(Rust 会自动传递引用)或&some_number
这是不正确的。Rust 在某些情况下(即在接收器中)会自动引用,但不是所有情况(其他参数)。这属于“并非全部”的情况。
其次,参考参考的成本更高。如果调用者已经拥有一个拥有的值,我们需要将其存储在堆栈中(而不是寄存器),获取对它的引用,并且函数需要取消引用它。这会消耗 CPU 指令和周期。
第三,在传递一个引用之前取消引用它并不是一个大麻烦。这只需要*参数前面有一个小。
从理论上讲,该函数可以采用impl AsRef<usize>类似的东西。这将接受自有值和引用,但会产生其他成本:编译时间、二进制大小(可以通过添加内部函数并调用它来减轻,但这又会增加编译时间和 stdlib 的开发成本)、推理和一切都是为了节省星号这一可疑的好处。