猿问

为什么不允许引用字符串(&String)、Vec(&Vec)或Box(&Box)作为函数参数?

为什么不允许引用字符串(&String)、Vec(&Vec)或Box(&Box)作为函数参数?

我编写了一些锈蚀代码&String作为论据:

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}

然而,我收到一些反馈说,这样做不是一个好主意。为什么不行?


温温酱
浏览 640回答 2
2回答

皈依舞

我们可以用&str,&nbsp;&[T]或&T以允许使用更通用的代码。使用String或者是Vec是因为他们允许增加或减少容量。但是,当您接受不可变引用时,您不能在Vec或String.接受&String,&nbsp;&Vec或&Box也要求在调用函数之前要在堆上分配的参数。接受&str允许字符串文本(保存在程序数据中)并接受&[T]或&T允许堆栈分配的数组或变量。不必要的分配是一种性能损失。在尝试在测试中调用这些方法时,通常会立即公开这些方法。main方法:awesome_greeting(&String::from("Anna"));total_price(&vec![42,&nbsp;13,&nbsp;1337])is_even(&Box::new(42))另一个性能考虑是&String,&nbsp;&Vec和&Box引入不必要的间接层,因为您必须取消对&String得到一个String然后是第二次取消引用&str.相反,您应该接受串片&nbsp;(&str),a切片&nbsp;(&[T]),或者仅仅是一个引用(&T)。一个&String,&nbsp;&Vec<T>或&Box<T>将被自动胁迫到&str,&nbsp;&[T]或&T分别。fn&nbsp;awesome_greeting(name:&nbsp;&str)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;println!("Wow,&nbsp;you&nbsp;are&nbsp;awesome,&nbsp;{}!",&nbsp;name);}fn&nbsp;total_price(prices:&nbsp;&[i32])&nbsp;->&nbsp;i32&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;prices.iter().sum()}fn&nbsp;is_even(value:&nbsp;&i32)&nbsp;->&nbsp;bool&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;*value&nbsp;%&nbsp;2&nbsp;==&nbsp;0}现在,您可以使用更广泛的类型集来调用这些方法。例如,awesome_greeting可以用字符串文字调用("Anna")&nbsp;或分配String.&nbsp;total_price可以通过对数组的引用调用(&[1, 2, 3])&nbsp;或分配Vec.如果要从String或Vec<T>,你可以可变参考&nbsp;(&mut String或&mut Vec<T>):fn&nbsp;add_greeting_target(greeting:&nbsp;&mut&nbsp;String)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;greeting.push_str("world!");}fn&nbsp;add_candy_prices(prices:&nbsp;&mut&nbsp;Vec<i32>)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;prices.push(5); &nbsp;&nbsp;&nbsp;&nbsp;prices.push(25);}特别是对于片,您也可以接受&mut [T]或&mut str..这允许您在片内变异一个特定的值,但不能更改片内的项目数(这意味着它对字符串非常有限):fn&nbsp;reset_first_price(prices:&nbsp;&mut&nbsp;[i32])&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;prices[0]&nbsp;=&nbsp;0;}fn&nbsp;lowercase_first_ascii_character(s:&nbsp;&mut&nbsp;str)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;Some(f)&nbsp;=&nbsp;s.get_mut(0..1)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.make_ascii_lowercase(); &nbsp;&nbsp;&nbsp;&nbsp;}}
随时随地看视频慕课网APP
我要回答