亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么不允許引用字符串(&String)、Vec(&Vec)或Box(&Box)作為函數參數?

為什么不允許引用字符串(&String)、Vec(&Vec)或Box(&Box)作為函數參數?

溫溫醬 2019-06-06 10:37:42
為什么不允許引用字符串(&String)、Vec(&Vec)或Box(&Box)作為函數參數?我編寫了一些銹蝕代碼&String作為論據:fn awesome_greeting(name: &String) {     println!("Wow, you are awesome, {}!", name);}我還編寫了代碼,其中引用了Vec或Box:fn total_price(prices: &Vec<i32>) -> i32 {     prices.iter().sum()}fn is_even(value: &Box<i32>) -> bool {     **value % 2 == 0}然而,我收到一些反饋說,這樣做不是一個好主意。為什么不行?
查看完整描述

2 回答

?
皈依舞

TA貢獻1851條經驗 獲得超3個贊

我們可以用&str&[T]&T以允許使用更通用的代碼。


  1. 使用String或者是Vec是因為他們允許增加或減少容量。但是,當您接受不可變引用時,您不能在VecString.

  2. 接受&String&Vec&Box要求在調用函數之前要在堆上分配的參數。接受&str允許字符串文本(保存在程序數據中)并接受&[T]&T允許堆棧分配的數組或變量。不必要的分配是一種性能損失。在嘗試在測試中調用這些方法時,通常會立即公開這些方法。main方法:

    awesome_greeting(&String::from("Anna"));
    total_price(&vec![42, 13, 1337])
    is_even(&Box::new(42))
  3. 另一個性能考慮是&String&Vec&Box引入不必要的間接層,因為您必須取消對&String得到一個String然后是第二次取消引用&str.

相反,您應該接受串片 (&str),a切片 (&[T]),或者僅僅是一個引用(&T)。一個&String&Vec<T>&Box<T>將被自動脅迫到&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"分配Stringtotal_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();
    }}


查看完整回答
反對 回復 2019-06-06
  • 2 回答
  • 0 關注
  • 672 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號