2

我一直在使用解构来创建对嵌套数据的引用,只是为了练习。我创建了一个使用解构来分解借来的元组的方法:

fn print_strings((x, y): &(String, String)) {
    println!("x: {}, y: {}", x, y);
}

fn main() {
    print_strings(&("foo".to_string(), "bar".to_string()));
}

如果我添加let () = xprint_strings()函数的第一行,编译器会告诉我 x 有 type &String。这使我相信这是deref coercion的一个实例,编译器正在将&(String, String)frommain()转换为 a(&String, &String)以用于print_strings().

但是后来我查阅了文档,tuple没有找到Deref. 所以我的问题是,编译器如何扩展这段代码?

我的假设是会发生这样的事情:

fn print_strings(a: &(String, String)) {
    let x = &(a.0);
    let y = &(a.1);
    println!("x: {}, y: {}", x, y);
}

编辑:

我想这不能解除强制,因为函数的签名与传入的参数相匹配main()

4

1 回答 1

0

由于您正在传递对元组print_strings()引用,因此不可能在String其中获得 a 。因此,当访问 中的那个元组的单个元素时print_strings(),a&String几乎是唯一有意义的东西。我相信这种解构是由编译器本身处理的。

于 2022-02-16T17:42:35.797 回答