我一直在使用解构来创建对嵌套数据的引用,只是为了练习。我创建了一个使用解构来分解借来的元组的方法:
fn print_strings((x, y): &(String, String)) {
println!("x: {}, y: {}", x, y);
}
fn main() {
print_strings(&("foo".to_string(), "bar".to_string()));
}
如果我添加let () = x
到print_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()