rust 函数签名中的自动借用

3j86kqsm  于 2023-02-08  发布在  其他
关注(0)|答案(1)|浏览(132)

我想知道,什么是正确的方法来编写函数签名,不需要移动的值,并乐于接受借用的值。考虑:

fn calculate(x:&f32) -> bool {
    if x > 5.0 {
        true
    }
    false
}

假设我不消耗这个值,那么在这个函数中借用的值就足够了。
现在当我调用这个函数时,情况会有所不同,要么是x值的终点:

let x = 4.0;
calculate(&x);

或者之后我需要再次使用x。

let x = 4.0;
calculate(&x);
let y = x + 5.0;

虽然上述方法有效,但对于calculate函数的用户来说,必须不断地输入“与”号是有点麻烦的,特别是在数字是硬编码的情况下:

calculate(&-2.5);

看起来很荒谬--我告诉计算机创造一个价值,借用它,使用它,然后处理它。
我希望有一种方法可以简化像float这样的大小类型,但我确实理解,对于动态大小的值,可能会有更多的复杂性。
理想情况下,我希望能够调用该函数,并传递给它一个借入值或拥有值。
把这个函数签名放在一起的正确方法是什么?有没有一种方法可以同时接受f32和&f32?
编辑:另外,我遇到的另一个情况是:

let x_borrowed = &4.0;
calculate(x_borrowed);

意思是,我只有借来的价值。
从到目前为止的评论来看,calculate函数似乎应该接受一个f32,并且当调用它时,我应该给予它f32或者解引用一个&f32,除非有一个自动解引用的特性,有人可以告诉我?

tp5buhyn

tp5buhyn1#

对于实现Copy trait的类型,不需要传递引用,因为函数不会获得原始值的所有权,而是创建一个副本传递给函数。
但是,对于不实现Copy的类型(例如String),您可以使用AsRef trait来执行类似的操作。

fn is_length_of_4(s: impl AsRef<str>) -> bool {
    s.as_ref().len() == 4
}

// These will all work
assert!(is_length_of_4("Test"));
assert!(is_length_of_4(String::from("Test")));
assert!(is_length_of_4(&String::from("Test")));

相关问题