You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fnmain(){// 使用尽可能多的方法来通过编译let x = String::from("hello, world");let y = x;println!("{},{}",x,y);}
法1
fnmain(){let x = "hello,world";let y = x;println!("{},{}",x,y);}
法2
fnmain(){let x = String::from("hello,world");let y = x.clone();println!("{},{}",x,y);}
fnmain(){let x = Box::new(5);let ...// 完成该行代码,不要修改其它行!*y = 4;assert_eq!(*x,5);}
例1
fnmain(){let x = Box::new(5);letmut y = x;*y = 4;assert_eq!(*y,4);}//这是正确的
例2
fnmain(){let x = Box::new(5);letmut y = x.clone();*y = 4;assert_eq!(*x,5);//原因是第27行通过clone创建了一个新的指针并克隆了x的值,所以y与x并未指向同一地址}
例3
fnmain(){let x = Box::new(5);letmut y = x;*y = 4;assert_eq!(*x,4);}//该代码会报错,原因是在第38行进行了所有权转移,x失效了
在给定的代码中,let ref r2 = c; 和 let r1 = &c; 的作用是相同的,它们都创建了对变量 c 的引用。这两种方式都可以用来创建引用,但是 ref 更多地用于模式匹配中,而 & 更多地用于普通的引用创建。
另外,关于内存地址的比较,由于 r1 和 r2 都是对同一个变量 c 的引用,所以它们指向的内存地址是相同的。因此,assert_eq!(get_addr(r1), get_addr(r2)); 这行代码会通过断言,因为它们的内存地址是相等的。
fnmain(){letmut x = 100;let y = &mut x;*y += 100;let z = &mut x;*z += 1000;assert_eq!(x,1200);}fnmain(){letmut x = 100;let y = &mut x;let z = &mut x;*y +=100;*z += 1000;assert_eq!(x,1200);}/*在 Rust 中,对同一个变量同时存在多个可变引用是不允许的,这是 Rust 的借用规则所限制的。在第一个示例中,由于 y 和 z 的作用域没有重叠,它们分别持有了对 x 的独立可变引用,因此代码能够编译并运行。 而在第二个示例中,虽然 y 和 z 的作用域也没有重叠,但是在后续的代码中将同时使用 *y += 100; 和 *z += 1000; 来修改同一个变量 x。这违反了 Rust 的借用规则,因为在同一时间只能有一个可变引用,而将 y 和 z 分开赋值并不改变它们指向的是同一个变量的事实。*/
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
-
所有权和借用
所有权
引用与借用
引用与借用的功效都一样,借用使用&关键字,引用使用ref关键字。借用的对象是必须存在的,引用的对象可以是虚拟的,后期附上对象。
我们可以这样看,借用表示借来某个东西,这个东西是有主人的,而引用类似于我们保留了网上某篇文章的链接,这个链接指向的内容可能是不存在的并且将来可以修改链接的内容。但是实际情况中不必区分两者概念
值得注意的是在 Rust 中,打印引用时不需要使用
*解引用操作符,因为 Rust 的标准库已经为常见类型实现了Displaytrait,使得可以直接打印引用指向的数据。无论你是否使用*解引用操作符,println!("{}, {}", r1, r2)都会正确地打印出r1和r2引用的字符串内容。此处这里的引用就是借用,总的来说,借用规则如下
在给定的代码中,
let ref r2 = c;和let r1 = &c;的作用是相同的,它们都创建了对变量c的引用。这两种方式都可以用来创建引用,但是ref更多地用于模式匹配中,而&更多地用于普通的引用创建。另外,关于内存地址的比较,由于
r1和r2都是对同一个变量c的引用,所以它们指向的内存地址是相同的。因此,assert_eq!(get_addr(r1), get_addr(r2));这行代码会通过断言,因为它们的内存地址是相等的。Beta Was this translation helpful? Give feedback.
All reactions