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小時內與您取得聯系。