为何接收i32所有权的Rust函数需将参数声明为可变?
为什么Rust里给i32参数加mut才能修改?
你混淆了Copy trait和变量可变性这两个完全独立的概念:
Copy trait的作用:
i32实现Copy,只是意味着当你把它作为参数传递给函数时,会自动复制一份值给函数的参数绑定,而不是转移原变量的所有权。但这和参数能不能被修改没有任何关系。Rust的默认不可变性:
Rust里所有变量(包括函数参数)默认都是不可变绑定,不管它是不是Copy类型。也就是说,一旦变量被初始化,你不能直接给它重新赋值,除非你在声明时加上mut关键字,明确告诉编译器这个变量的值可以被修改。
回到你的代码:
原函数里的a = a - b和b = b - a都是对参数变量的重新赋值操作,这属于修改变量的值。因为你没有给参数加mut,编译器会阻止这种修改——这是Rust的安全机制,防止意外修改变量。
而添加mut a: i32后,你是在告诉编译器:这个a是可变绑定,我可以在函数里修改它的值。这和Copy trait无关,只是在声明变量的可变性。
简单总结:Copy管的是值如何传递,mut管的是变量能不能被修改,两者互不影响。
内容的提问来源于stack exchange,提问作者Pioneer_11
相关产品推荐
相关产品推荐

