gpt4 book ai didi

string - 为什么不鼓励接受对String(&String),Vec(&Vec)或Box(&Box)的引用作为函数参数?

转载 作者:行者123 更新时间:2023-12-03 11:46:55 26 4
gpt4 key购买 nike

我编写了一些将&String作为参数的Rust代码:

fn awesome_greeting(name: &String) {
println!("Wow, you are awesome, {}!", name);
}

我还编写了引用 VecBox的代码:
fn total_price(prices: &Vec<i32>) -> i32 {
prices.iter().sum()
}

fn is_even(value: &Box<i32>) -> bool {
**value % 2 == 0
}

但是,我收到一些反馈,认为这样做不是一个好主意。为什么不?

最佳答案

TL; DR:您可以改为使用&str&[T]&T允许使用更多通用代码。

  • 使用StringVec的主要原因之一是因为它们允许增加或减少容量。但是,当您接受不可变的引用时,就不能在VecString上使用任何这些有趣的方法。
  • 接受&String&Vec&Box以及都要求该参数必须在堆上分配,然后才能调用该函数。接受&str允许使用字符串文字(保存在程序数据中),接受&[T]&T允许使用堆栈分配的数组或变量。不必要的分配是性能损失。当您尝试在测试中或main方法中调用这些方法时,通常会立即暴露该错误:
    awesome_greeting(&String::from("Anna"));
    total_price(&vec![42, 13, 1337])
    is_even(&Box::new(42))
  • 另一个性能考虑因素是&String&Vec&Box引入了不必要的间接层,因为您必须取消引用&String以获得String,然后执行第二次取消引用才能最终到达&str

  • 相反,您应该接受字符串切片( &str),切片( &[T])或仅引用( &T)。 &String&Vec<T>&Box<T>将分别自动强制(通过 deref coercion)为 &str&[T]&T
    fn awesome_greeting(name: &str) {
    println!("Wow, you are awesome, {}!", name);
    }
    fn total_price(prices: &[i32]) -> i32 {
    prices.iter().sum()
    }
    fn is_even(value: &i32) -> bool {
    *value % 2 == 0
    }
    现在,您可以使用更广泛的类型来调用这些方法。例如,可以使用字符串文字( awesome_greeting)或分配的 "Anna"调用 String。可以通过引用数组( total_price)或分配的 &[1, 2, 3]来调用 Vec

    如果您想从 StringVec<T>中添加或删除项目,则可以采用可变引用( &mut String&mut Vec<T>):
    fn add_greeting_target(greeting: &mut String) {
    greeting.push_str("world!");
    }
    fn add_candy_prices(prices: &mut Vec<i32>) {
    prices.push(5);
    prices.push(25);
    }
    专门用于切片,您还可以接受 &mut [T]&mut str。这允许您更改切片内的特定值,但不能更改切片内的项目数(这意味着它对于字符串非常受限制):
    fn reset_first_price(prices: &mut [i32]) {
    prices[0] = 0;
    }
    fn lowercase_first_ascii_character(s: &mut str) {
    if let Some(f) = s.get_mut(0..1) {
    f.make_ascii_lowercase();
    }
    }

    关于string - 为什么不鼓励接受对String(&String),Vec(&Vec)或Box(&Box)的引用作为函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65674207/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com