代码之家  ›  专栏  ›  技术社区  ›  kreo

为什么&[T]参数也接受&Vec?

  •  5
  • kreo  · 技术社区  · 7 年前

    我正在翻阅铁锈书,即 minigrep project .在那里,我遇到了以下片段:

    fn main() {
        let args: Vec<String> = env::args().collect();
    
        let (query, filename) = parse_config(&args);
    
        // --snip--
    }
    
    fn parse_config(args: &[String]) -> (&str, &str) {
        let query = &args[1];
        let filename = &args[2];
    
        (query, filename)
    }
    

    让我困惑的是 args: &[String] .如果我将其替换为 args: &Vec<String> ,它也可以工作。我猜是这样的 &[String] 是一种更通用的类型注释,它不仅匹配 &Vec<String> ,但也有一些其他类型。对吗?如果是,还有哪些其他类型与之匹配 [T] ?

    1 回复  |  直到 7 年前
        1
  •  7
  •   kmdreko    3 年前

    一般来说, [T] is a contiguous sequence and &[T] is a slice

    编译器允许 &[String] 而不是 &Vec<String> 是吗 Vec<T> dereferences to [T] .这叫做 Deref coercion 可以说,前一种表示法(在函数参数中)更为通用;它也是 the preferred one 。有关自动取消引用规则的详细信息,请参阅 this question