ust 发布团队发布了最新版本 1.80.0,Rust 是一种强大的编程语言,使开发者能够构建可靠、高效的软件,秉承了 Rust 团队一贯的风格,1.80.0 版本在效率、代码安全性和灵活性方面均有大幅升级,使得 Rust 语言更加强大和易用,这次更新带来了哪些新特性和改进?我们一起来看一看:
注:关于 1.80.0 更详细升级信息可查看 Rust 1.80.0 的详细发行公告 。也可以在 GitHub 上查看 1.80.0 的发行日志 。
如果已经安装了以前版本的 Rust,可以通过以下命令升级到 1.80.0 版本:
$ rustup update stable
如果还没有安装,可以从网站上的相应页面获取 rustup 安装。
(命令: curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh)
如果想使用测试未来版本,可以考虑使用 beta 版本(rustup default beta) 或 nightly 版本 (rustup default nightly),这两个版本不太稳定,使用过程中可能遇到错误,如果遇到任何错误,可以发送报告。
Rust 1.80 中新增加了 LazyCell 和 LazyLock 两个同步原语,这些“懒惰”类型会延迟数据的初始化,直到第一次访问时才进行初始化。它们与 1.70 中稳定的 OnceCell 和 OnceLock 类型类似,但初始化函数包含在 cell 中。这标志着从流行的 lazy_static 和 once_cell 库中引入的功能已经在标准库中稳定化了,所以后续你应该不用使用社区的lazy_static 和 once_cell 库了。
注:
OnceLock:是 Rust 中的一种类型,其作用是提供一种只能被初始化一次的锁。一旦锁被获取,它就不能再次被初始化。这对于一些需要全局可变状态,但不能重复初始化的情况很有用。
OnceCell:是 Rust 中的一种类型,这种类型的实例只能被赋值一次。一旦实例被赋值,就不能再改变其值。这种类型通常用于延迟初始化的全局变量。
LazyLock 是线程安全的,它是线程安全的选项,因此适用于像静态值static这样的场合。无论哪个线程首次访问静态值,都只会被初始化一次,所有线程都会看到相同的值。
例如,下面例子中spawn线程和主线程都将看到完全相同的持续时间,因为 LAZY_TIME 将由首次访问静态值的任一线程进行一次性初始化。它们都不需要知道如何初始化它,这与 OnceLock::get_or_init() 不同。
代码如下:
use std::sync::LazyLock;
use std::time::Instant;
static LAZY_TIME: LazyLock<Instant>=LazyLock::new(Instant::now);
fn main() {
let start=Instant::now();
std::thread::scope(|s| {
s.spawn(|| {
println!("Thread lazy time is {:?}", LAZY_TIME.duration_since(start));
});
println!("Main lazy time is {:?}", LAZY_TIME.duration_since(start));
});
}
LazyCell 在没有线程同步的情况下执行相同的操作,所以它没有实现 Sync,这对于静态来说是必要的,但它仍然可以在 thread_local! 静态中使用(每个线程都有不同的初始化)。
注:总的来说,LazyLock、LazyCell、OnceLock和OnceCell都是用于延迟初始化数据的工具,LazyLock和LazyCell内置了的初始化,所以使用者不需要手动初始化它,而OnceLock和OnceCell则需要手动初始化。
在Rust 1.79 中,rustc稳定了一个--check-cfg 标志,现在 Rust1.80 的 Cargo 对其cfg知道的所有名称和值启用这些检查,包括对Cargo.toml以及cargo::rustc-check-cfg构建脚本的输出。
默认警告unexpected_cfgs lint 会报告意外的 cfg,用于捕获拼写错误或其他错误配置。例如,在具有可选rayon依赖项的项目中,代码配置了错误的feature值,会被检测出来发出警告,如下所示:
fn main() {
println!("Hello, world!");
#[cfg(feature="crayon")]
rayon::join(
|| println!("Hello, Thing One!"),
|| println!("Hello, Thing Two!"),
);
}
warning: unexpected `cfg` condition value: `crayon`
--> src/main.rs:4:11
|
4 | #[cfg(feature="crayon")]
| ^^^^^^^^^^--------
| |
| help: there is a expected value with a similar name: `"rayon"`
|=note: expected values for `feature` are: `rayon`=help: consider adding `crayon` as a feature in `Cargo.toml`=note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg/cargo-specifics.html> for more information about checking conditional configuration=note: `#[warn(unexpected_cfgs)]` on by default
无论实际rayon功能是否启用,都会报告相同的警告。
[lints]清单中的表格还可Cargo.toml用于扩展自定义的已知名称和值的列表cfg。rustc自动提供警告中使用的语法。
[lints.rust]
unexpected_cfgs={ level="warn", check-cfg=['cfg(foo, values("bar"))'] }
注:有关此功能的更多信息可以之前的博客文章(https://blog.rust-lang.org/2024/05/06/check-cfg.html)。
Rust 的范围现在可以使用独占端点,写成a..b或..b类似于Range和RangeTo表达式类型。例如,以下模式现在可以在一个模式的终点和下一个模式的起点使用相同的常量:
pub fn size_prefix(n: u32) -> &'static str {
const K: u32=10u32.pow(3);
const M: u32=10u32.pow(6);
const G: u32=10u32.pow(9);
match n {
..K=> "",
K..M=> "k",
M..G=> "M",
G..=> "G",
}
}
以前,模式中只允许包含(a..=b或..=b)或开放(a..)范围,因此像这样的代码需要为包含端点设置单独的常量(如K - 1)。
一直以来,Exclusive ranges 是一个不稳定的功能。Rust 团队表示,该功能稳定下来的阻碍因素在于它们可能会增加混乱并增加模式中出现 off-by-one errors 的可能性。在 Rust 1.80 中,exhaustiveness checking 得到了增强,可以更好地检测模式匹配中的差距,新的lintnon_contiguous_range_endpoints 和 overlapping_range_endpoints 将有助于检测在哪些情况下需要将 exclusive 模式和 inclusive 模式相互切换。
这些 API 现在在 const 上下文中是稳定的:
了解更多有关 Rust、Cargo和 Clippy中所有变化的详细信息,请参阅Rust 1.80.0 完整的发布公告和版本的升级标记 。
关于1.80.0 升级的更多信息,可以查阅:
1-1、HTML语义化的理解
HTML语义化是不需要知道HTML里面的内容就能知道这段话的含义,例如h1的标签表示标题,p标签表示段落,ul表示无序列表等等。这样有两个好处,一是利于代码理解和走查,二是利于机器理解做seo的优化。
1-2 HTML中哪些是标签是块级元素,哪些是内联元素
块级标签:h1 p div ul section等
内联标签:img span i input a 等等
2-1、盒模型宽度的计算
.div1{
width:100px;
padding:10px;
border:1px solid #ccc;
margin:20px;
// box-sizing:border-box 如果加上这个属性
}
div1的offsetWidth=内容宽度(width)+ 内边距(padding)+ 边框(border) 无外边距(margin)=100 + 20 + 2==122px;如果加上box-sizing:border-box 那div1的offsetWidth就是100px,这个内容的宽度包含了padding和border宽度
2-2 margin纵向重叠问题
<body>
<p>AAA</p>
<p></p>
<p></p>
<p></p>
<p>BBB</p>
</body>
<style type="text/css">
p {
font-size: 16px;
line-height: 1;
margin-top: 10px;
margin-bottom: 15px;
}
</style>
AAA到BBB的距离为15px,这是因为相邻元素的margin-top和margin-bottom会发生重叠,空白的p标签也会发生重叠(类似于被忽略掉的意思),所以实际AAA和BBB的距离就是15px
2-3 maring负值的问题
margin-top、margin-left设置负值,元素本身会向上,向左移动
margin-right 设置为负值,元素本身不受影响,它右侧的元素会向左移动
margin-bottom设置为负值,元素本身不受影响,它下方的元素会向上移动
2-4 BFC(block format context)块级格式化上下文的理解与应用
bfc表示一块独立的渲染区域,内部元素的渲染不会影响到边界以外的元素
形成bfc的条件,例如: float不为none;position为absolut或fixed; overflow不为visible;
display为flex或inline-block等。
bfc常用来清除浮动。
2-5 float布局
圣杯布局,圣杯布局是指两边盒子宽度固定,中间盒子自适应的三栏布局,其中,中间栏放到文档流前面,保证先行渲染;三栏全部使用“float:left”浮动,并配合left和right属性。其核心是三个盒子都设置浮动,主体盒子设置宽度100%,左侧盒子设置margin:-100%,右侧盒子设置maring-right为负值,具体的值和右侧盒子宽度等同
上代码,直接可以copy代码在在html文件看看效果
<style type="text/css">
.header {
width: 100%;
height: 100px;
background-color: #ccc;
}
.footer {
clear: both;
width: 100%;
height: 100px;
background-color: beige;
}
.main {
height: 300px;
margin: 0;
width: 800px;
padding-left: 200px;
padding-right: 150px;
overflow: hidden;
}
.main .float {
float: left;
}
.main .content {
width: 100%;
height: 300px;
background-color: #999;
}
.main .main-left {
width: 200px;
height: 300px;
background-color: #f00;
margin-left: -100%;
position: relative;
right: 200px;
}
.main .main-right {
width: 150px;
height: 300px;
background-color: #f90;
margin-right: -150px;
}
</style>
<body>
<div class="header">头部</div>
<div class="main">
<div class="content float">前端的两个经典布局想必大家都有多了解--圣杯布局和双飞翼布局,因为它既能体现你懂HTML结构又能体现出你对DIV+CSS布局的掌握。
事实上,圣杯布局其实和双飞翼布局是一回事。它们实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局。它们实现的效果是一样的,差别在于其实现的思想</div>
<div class="main-left float">左侧</div>
<div class="main-right float">右侧</div>
</div>
<div class="footer">底部</div>
</body>
2-6 手写clearfix
.clearfix:after{
content: ' ';
display:table;
clear:both;
}
2-7 flex布局
flex布局主要有5个基础属性:
flex-direction属性,主轴的方向,可以是水平方向,也可以是垂直方向
justify-content属性,主轴对齐的方式,开始,居中,两端对齐等方式
flex-wrap属性,是否换行显示
align-items属性,与主轴垂直方向的显示方式,有开始,居中,末端对齐等方式
align-self,子元素在与主轴垂直方向的显示方式,有开始,居中,末端对齐等方式
应用场景:用flex布局画一个骰子的3
<div class="box">
<span class="item"></span>
<span class="item"></span>
<span class="item"></span>
</div>
<style type="text/css">
.box {
width: 200px;
height: 200px;
border: 2px solid #ccc;
border-radius: 10px;
padding: 20px;
display: flex;
justify-content: space-between;
}
.item {
display: block;
width: 40px;
height: 40px;
border-radius: 50%;
background-color: #666;
}
.item:nth-child(2) {
align-self: center;
}
.item:nth-child(3) {
align-self: flex-end;
}
</style>
千里之行,始于足下,关于技术的沉淀,从今天开始,记录这么些年开发总结的点点滴滴~!
TML即超文本标记语言是一种用于创建网页的标准标记语言。对于初学者来说一般可以使用工具来生成html,如:DW,HB等,这些都是所见即所得的工具,在设计视图将需要展现的文字、段落、图片等内容通过软件排好版,在代码视图将由软件自动生成对应的HTML代码,这些代码由客户电脑上的浏览来解析执行。
HTML语言是一种优美的语言,几乎所有的标记都是成对出现的,配合CSS样式和JS脚本来控制页面显示的样式及效果。有一定开发经验的高手往往可以直接用代码视图来编写网页,不管是软件生成html还是手写HTML代码最终显示的效果都是一致的。如下图是由DW设计的网页,下方代码对应的就是HTML代码,视图效果和代码是一一对应的。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
*请认真填写需求信息,我们会在24小时内与您取得联系。