当前位置: 首页 > news >正文

个人网站可以做资讯吗音乐网站制作视频教学

个人网站可以做资讯吗,音乐网站制作视频教学,沧州百度推广总代理,网站建设做软件开发吗一、引用是什么 引用,又叫做借用。是一个指针类型。 引用是指向数据的指针,它允许我们以只读或可变的方式访问数据,而不获取数据的所有权。 编译器静态地保证了引用总是指向有效的对象。也就是说,当存在引用指向一个对象时&#…

一、引用是什么

引用,又叫做借用。是一个指针类型。
引用是指向数据的指针,它允许我们以只读或可变的方式访问数据,而不获取数据的所有权。
编译器静态地保证了引用总是指向有效的对象。也就是说,当存在引用指向一个对象时,该对象不能被销毁

二、定义引用

在Rust中,使用&符号来创建引用。
(一)不可变引用
不可变引用,又叫共享引用。
不可变引用允许我们以只读方式访问数据,不允许修改数据。

语法格式

& type

示例:

fn main() {let mut x = 5;let y = &x;println!("x: {}", x);println!("y: {}", y);
}

可变变量x和不可变引用y,指向变量x的值。

(二)可变引用
可变引用允许我们以读写方式访问和修改数据。
语法格式

&mut type

示例:

let mut x = 5;
let y = &mut x;
*y += 1;
println!("x: {}", x);
println!("y: {}", y);

可变变量x和可变引用y,通过可变引用y修改了变量x的值。

引用的变量如果要变更,必须符合满足三个要求:
变量本身是可变的,也就是定义时必须添加 mut 关键字。
函数的参数也必须定义为可变的,也就是必须添加 &mut 关键字。
传递引用也必须是可变的,也就是传递参数时必须添加 &mut 关键字。
以上三个条件,任意一个不满足,都会报错。

三、使用引用

使用解引用操作符*来获取引用所指向的值

fn add_one(e: &mut i32) {*e+= 1;
}
fn main() {let mut i = 3;println!("before {}",i);add_one(&mut i);println!("after {}", i);
}
编译运行结果如下
before 3
after 4
let x = 5;
let y = &x;
assert_eq!(5, x);
assert_eq!(5, *y);
如果使用assert_eq!(5, y);,则会得到编译错误,不允许比较数字的引用与数字,因为它们是不同的类型。

四、悬垂引用

在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个悬垂指针,悬垂指针也叫野指针,是其指向的内存可能已经被分配给其它人。它们就像失去悬挂物体的绳子,所以叫"悬垂指针"。
"悬垂引用"是一种悬垂指针。
在Rust语言里不允许出现悬垂引用
比如

fn main() {let reference_to_nothing = dangle();
}
fn dangle() -> &String {let s = String::from("hello");&s
}

编译错误。
因为 s 是在 dangle 函数内创建的,当 dangle 的代码执行完毕后,s 将被释放。返回的引用会指向一个无效的 String,这可不对!Rust不会允许我们这么做。
这里的解决方法是直接返回 String:

fn no_dangle() -> String {let s = String::from("hello");s
}

这样就没有任何错误了。所有权被移动出去,所以没有值被释放。

五、引用的规则

1.在同一时间点,要么 只能有一个可变引用,要么 只能有多个不可变引用。
2.引用必须总是有效的

一个引用的作用域从声明的地方开始一直持续到最后一次使用为止。
例如,

let mut s = String::from("hello");
let r1 = &s; // 没问题
let r2 = &s; // 没问题
println!("{} and {}", r1, r2); // 此位置之后r1和r2不再使用
let r3 = &mut s; // 没问题
println!("{}", r3);

不可变引用 r1 和 r2 的作用域在 println! 之后结束,这也是创建可变引用 r3 的地方。它们的作用域没有重叠,所以代码是可以编译的。

比如,下面例子是错误的,因为同一时间存在多个可变引用。

let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s;
println!("{}, {}", r1, r2);

下面例子也是错误的,因为同一时间既存在可变引用,又存在不可变引用

let mut s = String::from("hello");
let r1 = &s; // 没问题
let r2 = &s; // 没问题
let r3 = &mut s; // 大问题
println!("{}, {}, and {}", r1, r2, r3);
http://www.yayakq.cn/news/41214/

相关文章:

  • 手机网站发布页电脑版宣城seo
  • 做网站需要交印花税深圳免费推广网站大全
  • 站优云seo优化网站续费合同
  • 刚做的单页网站怎么预览绍兴企业建站模板
  • 5免费建站网站朋友圈链接怎么制作
  • 手机网站建设优势如何做网站条幅闪图
  • 网站价值评估怎么做网站建设一般考虑哪些因素
  • 关于网站建设的论文题目前端优化
  • 虚拟币网站开发制作百度seo怎么收费
  • 装修公司网站建设设计作品全国知名vi设计公司
  • 免费下载ppt的网站国家免费技能培训
  • 睢县做网站编程网站ide做的比较好的
  • 网站设计的公司皆选奇点网络建立网站赚钱
  • 烟台规划网站建筑行业网
  • 网站开发常用工具wordpress怎么做301
  • 高校门户网站开发网站建设采取招标的方式
  • 高平市网站建设公司上海做门户网站的公司
  • 网站怎么做中英文交互火车头wordpress数据库
  • 资阳网站优化wordpress如何添加二级菜单
  • 泉州网站建设哪里优惠wordpress同步新浪博客
  • 开发网站公司免费静态网页
  • 家政服务网站模板全国安装平台有哪些
  • php建设网站教程wordpress解析完403
  • 北京市建设厅门户网站福州网站建设出格
  • 石家庄+网站建设wordpress 安装的时候是英文
  • 制作网站需要什么技术秦皇岛在哪里
  • win7 iis网站无法显示该页面西安手机网站定制网站建设
  • 开题报告旅游网站开发建设通网站查
  • 培训网站平台如何推广山东省住房和城乡建设部网站
  • 网站开发怎么用自己的电脑威海千淼网站建设