本Akatsuki飛船拍攝到的金星陰面熱紅外發(fā)光現(xiàn)象。
2017年,英國科學(xué)家領(lǐng)導(dǎo)的研究團(tuán)隊使用詹姆斯·克拉克·麥克斯韋望遠(yuǎn)鏡(JCMT),在266.94千兆赫下發(fā)現(xiàn)了金星無線電的一個特征信號。磷化氫和二氧化硫都會吸收這個頻率附近的無線電波。為了弄清楚究竟是哪種化合物“搗的鬼”,該團(tuán)隊在2019年用阿塔卡瑪大型毫米/亞毫米陣列(ALMA)進(jìn)行了后續(xù)觀測。最終,他們得出結(jié)論:金星的二氧化硫水平太低,無法解釋特征信號,因此,信號來自磷化氫。這令許多研究人員感到非常驚訝:地球大氣中含有的少量磷化氫是由生命產(chǎn)生的,難道被稱為“地獄之景”的金星,也以某種未知方式庇護(hù)了酸性云層中的生命?
此后,很多科學(xué)團(tuán)隊對該探測結(jié)果的可靠性提出了質(zhì)疑。phys.org網(wǎng)站當(dāng)?shù)貢r間1月27日報道,美國華盛頓大學(xué)領(lǐng)導(dǎo)的團(tuán)隊利用金星大氣的可靠輻射傳輸模型,重新考察并全面解釋了射電望遠(yuǎn)鏡觀測結(jié)果。相關(guān)論文可在arXiv預(yù)印網(wǎng)站中查詢。
研究人員模擬了不同層級金星大氣的磷化氫和二氧化硫信號,以及這些信號在JCMT和ALMA當(dāng)時設(shè)置條件下的接收情況。研究人員指出,被認(rèn)定為“磷化氫”信號特征顯示,吸收物質(zhì)并非來自金星云層,而是來自金星云層中層,距地表50公里以上的區(qū)域——這里高濃度的化學(xué)物質(zhì)和強(qiáng)烈的紫外線輻射,短短幾秒內(nèi)就會撕碎磷化氫分子。
天文學(xué)教授Victoria Meadows說:“二氧化硫是金星大氣中第三常見的化合物,它與生命跡象無關(guān)。中間大氣層的磷化氫甚至比金星云層中的磷化氫更脆弱。如果JCMT信號來自中間層,磷化氫必須以100倍于光合作用氧氣注入地球大氣的速度,輸入中間層。”考慮到信號強(qiáng)度、金星的二氧化硫水平以及金星大氣的惡劣化學(xué)環(huán)境(硫酸云),英國研究小組很可能根本沒有探測到磷化氫,此前的特征信號來自二氧化硫。
研究人員還發(fā)現(xiàn),ALMA的數(shù)據(jù)很可能嚴(yán)重低估了金星大氣中的二氧化硫含量,而這也是此前英國團(tuán)隊誤判“磷化氫”信號的原因之一。論文作者、噴氣推進(jìn)實驗室研究員Alex Akins說:“ALMA在2019年的天線配置條件會導(dǎo)致譜線稀釋現(xiàn)象——金星大氣中的常見氣體(如二氧化硫)釋放出的信號比更小范圍分布?xì)怏w釋放的信號更弱,這種現(xiàn)象最終造成JCMT的二氧化硫觀測值偏低。”
研究人員表示,全球科學(xué)家的最新觀測結(jié)果為金星的生命之謎提供了另一種解釋。劇毒的大氣、驚人的高壓及高溫,地獄般的金星對人類來說仍然是一個神秘的星球,還有很多謎團(tuán)有待解決。
原創(chuàng)編譯:雷鑫宇 審稿:西莫 責(zé)編:陳之涵
期刊來源:《天體物理學(xué)雜志》、《自然·天文學(xué)》
期刊編號:0004-637X,2397-3366
原文鏈接:https://phys.org/news/2021-01-purported-phosphine-venus-ordinary-sulfur.html
版權(quán)聲明:本文為原創(chuàng)編譯,中文內(nèi)容僅供參考,一切內(nèi)容以英文原版為準(zhǔn)。轉(zhuǎn)載請注明來源。
TML 規(guī)范的開發(fā)是一個漸進(jìn)的過程,有時會出現(xiàn)問題。隨著時間的推移,許多元素和屬性被添加到 HTML 中,直到后來 Web 社區(qū)集體意識到有更好的方法時才被刪除。由于已棄用和過時的元素和屬性已經(jīng)存在于網(wǎng)絡(luò)上,因此許多現(xiàn)代瀏覽器繼續(xù)支持它們的使用。盡管它們可能仍然有效,但您應(yīng)該始終遵循最新版本的要求 HTML。不能保證瀏覽器對過時和棄用元素的支持會持續(xù)下去。有效但執(zhí)行不A力。
有幾種 HTML 元素和屬性是有效的并且應(yīng)該被使用,但是這些特性的實現(xiàn)隨著時間的推移而發(fā)生了變化,而 Web 開發(fā)社區(qū)的一些人還沒有注意到。HTMLtables就是一個很好的例子。table在某一時刻,使用 HTML元素創(chuàng)建網(wǎng)頁布局是很常見的。幾乎沒有人再這樣做了,CSS 比tables以往任何時候都更強(qiáng)大。但是,即使是經(jīng)驗豐富的 Web 開發(fā)人員,也存在許多其他不太嚴(yán)重的誤用和語法錯誤。以下是一些經(jīng)常被誤用得完全有效且有用的 HTML 功能以及正確實現(xiàn)的示例。
雖然在技術(shù)上不是 HTML 元素,但DOCTYPE聲明應(yīng)該是每個 HTML 文檔中出現(xiàn)的第一件事。這個聲明是瀏覽器文檔中代碼的語言。過去,這個聲明包括幾個部分,可能會有點(diǎn)復(fù)雜。然而,在 HTML5 中,這很簡單:
使用該聲明開始每個人 HTML 文檔,Web 瀏覽器將準(zhǔn)確地知道您要說什么。
Web 瀏覽器必須知道用于編寫文檔的字符集才能正確呈現(xiàn)它。在絕大多數(shù)情況下,要聲明的正確字符集是UTF-8。如果您需要聲明其他任何內(nèi)容,很可能您已經(jīng)知道并知道如何去做。如果您不確定,請堅持使用 UTF-8 是一個安全的選擇。在 HTML5 中聲明字符集比在以前的 HTML 版本中要簡單得多。這是現(xiàn)代 HTML5 中聲明的正確語法:
只需將該行放到head您的 HTML 文檔中即可。
過去,通常使用meta標(biāo)簽來提供版權(quán)信息。但是,這不是處理此任務(wù)的正確方法,并且網(wǎng)絡(luò)爬蟲無法識別標(biāo)簽的這種標(biāo)簽外使用meta。識別版權(quán)的正確方法是使用HTML 文檔link中的元素,如下所示:head
您還可以在錨點(diǎn)和區(qū)域元素上使用rel="license"屬性值對。
在過去,通常使用如下語法將腳本添加到 HTML 文檔中:
這是有充分理由的。在某一時刻,許多瀏覽器無法識別script標(biāo)簽,并試圖將標(biāo)簽之間的內(nèi)容呈現(xiàn)為 HTML,從而導(dǎo)致它們以純文本形式顯示腳本。為了避免這個問題,開發(fā)人員會注釋掉文本,這樣它就不會被不受支持的瀏覽器呈現(xiàn)為 HTML。那些日子已經(jīng)離我們很遠(yuǎn)了。所有現(xiàn)代瀏覽器都支持該script標(biāo)簽。只需完全刪除 HTML 注釋括號,或者更好的是,將 JavaScript 編寫在單獨(dú)的文件中,然后使用script標(biāo)記將其導(dǎo)入到當(dāng)前的 HTML 文檔中,如下所示:
還有不少元素曾經(jīng)是 HTML 規(guī)范的一部分,但后來被棄用或廢棄。以下是您可能仍在使用的八個 HTML 元素,您應(yīng)該立即停止使用它們以及您可以使用的替代標(biāo)簽:
有許多元素和屬性曾經(jīng)是 HTML 的一部分,但執(zhí)行的任務(wù)更適合 CSS。這些元素已經(jīng)被棄用,取而代之的是讓 CSS 控制網(wǎng)頁呈現(xiàn)。
曾經(jīng)使用 HTML 元素(如font、basefont、center、strike和u. 這些元素都已被棄用,取而代之的是 CSS 提供的字體和排版控件。要了解更多信息,請查看我們的字體和網(wǎng)頁排版教程。一個從未真正流行起來的獨(dú)特標(biāo)簽是multicol。此標(biāo)簽可用于將文本分成多列,類似于報紙的外觀。現(xiàn)在可以使用 CSScolumns屬性在現(xiàn)代瀏覽器中創(chuàng)建類似但更強(qiáng)大的效果。
廣泛的 HTML 元素屬性曾經(jīng)可用于控制 HTML 元素的呈現(xiàn)。幾乎所有這些標(biāo)簽都已被棄用,現(xiàn)在 CSS 提供了相同的功能。如果您不熟悉 CSS 以及如何實現(xiàn)這些屬性,我們的 CSS 教程將幫助您立即開始使用層疊樣式表。下面是一些更常用的屬性和現(xiàn)在可以用來實現(xiàn)相同結(jié)果的 CSS 屬性。
在本文中,我們介紹了一些最常見的元素和屬性,這些元素和屬性使用不當(dāng)或已被棄用或過時。然而,我們真的只是觸及了冰山一角。如果您想了解已從 HTML 規(guī)范中刪除的所有 HTML 元素和屬性,請參閱以下資源:
者 | Jackyzhe
責(zé)編 | 屠敏
出品 | CSDN(ID:CSDNnews)
隨著我們的坑越來越多,越來越大,我們必須要對各種坑進(jìn)行管理了。Rust為我們提供了一套坑務(wù)管理系統(tǒng),方便大家有條不紊的尋找、管理、填埋自己的各種坑。
Rust提供給我們一些管理代碼的特性:
Packages:Cargo的一個特性,幫助你進(jìn)行構(gòu)建、測試和共享crates
Crates:生成庫或可執(zhí)行文件的模塊樹
Modules 和use:用于控制代碼組織、范圍和隱私路徑
Paths:struct、function和module的命名方法
下面我們來具體看一下這些特性是如何幫助我們組織代碼的。
Packages和Crates
package可以理解為一個項目,而crate可以理解為一個代碼庫。crate可以供多個項目使用。那我們的項目中package和crate是怎么定義的呢?
之前我們總是通過IDEA來新建項目,今天我們換個方法,在命令行中使用cargo命令來創(chuàng)建。
$ cargo new hello-world
Created binary (application) `hello-world` package
$ ls hello-world
Cargo.toml
src
$ ls hello-world/src
main.rs
可以看到,我們使用cargo創(chuàng)建項目后,只有兩個文件,Cargo.toml和src目錄下的main.rs。
Cargo.toml是管理項目依賴的文件,每個Cargo.toml定義一個package。main.rs文件的存在表示package中包含一個二進(jìn)制crate,它是二進(jìn)制crate的入口文件,crate的名稱和package相同。如果src目錄下存在lib.rs文件,說明package中包含一個和package名稱相同的庫crate。
一個package可以包含多個二進(jìn)制crate,它們由src/lib目錄下的文件定義。如果你的項目想引用他人的crate,可以在Cargo.toml文件中增加依賴。每個crate都有自己的命名空間,因此如果你引入了一個crate里面定義了一個名為hello的函數(shù),你仍然可以在自己的crate中再定義一個名為hello的函數(shù)。
Module
Module幫助我們在crate中組織代碼,同時Module也是封裝代碼的重要工具。接下來還是通過一個栗子來詳細(xì)了解Module。
前面我們說過,庫crate定義在src/lib.rs文件中。這里首先創(chuàng)建一個包含了庫crate的package:
cargo new --lib restaurant
然后在src中定義一些module和函數(shù)。
mod front_of_house {
mod hosting {
fn add_to_waitlist {}
fn seat_at_table {}
}
mod serving {
fn take_order {}
fn serve_order {}
fn take_payment {}
}
}
可以看到我們使用關(guān)鍵字mod來定義Module,Module中可以繼續(xù)定義Module或函數(shù)。這樣我們就可以比較方便的把相關(guān)的函數(shù)放到一個Module中,并為Module命名,提高代碼的可讀性。另外Module中還可以定義struct和枚舉。由于Module中可以嵌套定義子Module,最終我們定義出來的代碼類似一個樹形。
那么如何訪問Module中的函數(shù)呢?這就要提到Path了。這部分比較好理解,Module樹相當(dāng)于系統(tǒng)文件目錄,而Path則是目錄的路徑。
Path
這里的路徑和系統(tǒng)文件路徑一樣,都分為相對路徑和絕對路徑兩種。其中絕對路徑必須以crate開頭,因為它代碼整個Module樹的根節(jié)點(diǎn)。路徑之間使用的是雙冒號來表示引用。
現(xiàn)在我來嘗試在一個函數(shù)中調(diào)用add_to_waitlist函數(shù):
可以看到這里不管用絕對路徑還是相對路徑都報錯了,錯誤信息是模塊hosting和函數(shù)add_to_waitlist是私有(private)的。我們先暫時放下這個錯誤,根據(jù)這里的錯誤提示,我們知道了當(dāng)我們定義一個module時,默認(rèn)情況下是私有的,我們可以通過這種方法來封裝一些代碼的實現(xiàn)細(xì)節(jié)。
OK,回到剛才的問題,那我們怎么才能解決這個錯誤呢?地球人都知道應(yīng)該把對應(yīng)的模塊與函數(shù)公開出來。Rust中標(biāo)識模塊或函數(shù)為公有的關(guān)鍵字是pub。
我們用pub關(guān)鍵字來把對應(yīng)的模塊和函數(shù)公開:
這樣我們就可以在module外來調(diào)用module內(nèi)的函數(shù)了。
Rust中的私有規(guī)則
現(xiàn)在我們再回過頭來看Rust中的一些私有規(guī)則,如果你試驗了上面的例子,也許會有一些發(fā)現(xiàn)。
Rust中私有規(guī)則適用于所有項(函數(shù)、方法、結(jié)構(gòu)體、枚舉、模塊和常量),它們默認(rèn)都是私有的。父模塊中的項不能訪問子模塊中的私有項,而子模塊中的項可以訪問其祖輩(父模塊及以上)中的項。
Struct和Enum的私有性
Struct和Enum的私有性略有不同,對于Struct來講,我可以只將其中的某些字段設(shè)置為公有的,其他字段可以仍然保持私有。
mod back_of_house {
pub struct Breakfast {
pub toast: String,
seasonal_fruit: String,
}
impl Breakfast {
pub fn summer(toast: &str) -> Breakfast {
Breakfast {
toast: String::from(toast),
seasonal_fruit: String::from("peaches"),
}
}
}
}
pub fn eat_at_restaurant {
// Order a breakfast in the summer with Rye toast
let mut meal = back_of_house::Breakfast::summer("Rye");
// Change our mind about what bread we'd like
meal.toast = String::from("Wheat");
println!("I'd like {} toast please", meal.toast);
}
而對于Enum,如果一個Enum是公有的,那么它的所有值都是公有的,因為私有的值沒有意義。
相對路徑和絕對路徑的選擇
這種選擇不存在正確與否,只有是否合適。因此這里我們只是舉例說明一些合適的情況。
我們?nèi)砸陨鲜龃a為例,如果我們可以預(yù)見到以后需要把front_of_house模塊和eat_at_restaurant函數(shù)移動到一個新的名為customer_experience的模塊中,就應(yīng)該使用相對路徑,這樣我們就對其進(jìn)行調(diào)整。
類似的,如果我們需要把eat_at_restaurant函數(shù)移動到dining模塊中,那么我們選擇絕對路徑的話就不需要做調(diào)整。
綜上,我們需要對代碼的優(yōu)化方向有一些前瞻性,并以此來判斷需要使用相對路徑還是絕對路徑。
相對路徑除了以當(dāng)前模塊開頭外,還可以以super開頭。它表示的是父級模塊,類似于文件系統(tǒng)中的兩個點(diǎn)(..)。
use關(guān)鍵字
絕對路徑和相對路徑可以幫助我們找到指定的函數(shù),但用起來也非常的麻煩,每次都要寫一大長串路徑。還好Rust為我們提供了use關(guān)鍵字。在很多語言中都有import關(guān)鍵字,這里的use就有些類似于import。不過Rust會提供更加豐富的用法。
use最基本的用法就是引入一個路徑。我們就可以更加方便的使用這個路徑下的一些方法:
mod front_of_house {
pub mod hosting {
pub fn add_to_waitlist {}
}
}
use crate::front_of_house::hosting;
pub fn eat_at_restaurant {
hosting::add_to_waitlist;
}
這個路徑可以是絕對路徑,也可以是相對路徑,但如果是相對路徑,就必須要以self開頭。上面的例子可以寫成:
use self::front_of_house::hosting;
這與我們前面講的相對路徑似乎有些矛盾,Rust官方說會在之后的版本處理這個問題。
use還可以更進(jìn)一步,直接指向具體的函數(shù)或Struct或Enum。但習(xí)慣上我們使用函數(shù)時,use后面使用的是路徑,這樣可以在調(diào)用函數(shù)時知道它屬于哪個模塊;而在使用Struct/Enum時,則具體指向它們。當(dāng)然,這只是官方建議的編程習(xí)慣,你也可以有自己的習(xí)慣,不過最好還是按照官方推薦或者是項目約定的規(guī)范比較好。
對于同一路徑下的某些子模塊,在引入時可以合并為一行,例如:
use std::io;
use std::cmp::Ordering;
// 等價于
use std::{cmp::Ordering, io};
有時我們還會遇到引用不同包下相同名稱Struct的情況,這時有兩種解決辦法,一是不指定到具體的Struct,在使用時加上不同的路徑;二是使用as關(guān)鍵字,為Struct起一個別名。
方法一:
use std::fmt;
use std::io;
fn function1 -> fmt::Result {
// --snip--
}
fn function2 -> io::Result<> {
// --snip--
}
方法二:
use std::fmt::Result;
use std::io::Result as IoResult;
fn function1 -> Result {
// --snip--
}
fn function2 -> IoResult<> {
// --snip--
}
如果要導(dǎo)入某個路徑下的全部模塊或函數(shù),可以使用*來表示。當(dāng)然我是非常不建議使用這種方法的,因為導(dǎo)入全部的話,如果出現(xiàn)名稱沖突就會很難排查問題。
對于外部的依賴包,我們需要先在Cargo.toml文件中添加依賴,然后就可以在代碼中使用use來引入依賴庫中的路徑。Rust提供了一些標(biāo)準(zhǔn)庫,即std下的庫。在使用這些標(biāo)準(zhǔn)庫時是不需要添加依賴的。
有些同學(xué)看到這里可能要開始抱怨了,說好了介紹怎么拆分文件,到現(xiàn)在還是在一個文件里玩,這不是欺騙讀者嘛。
別急,這就開始拆分。
開始拆分
我們拿剛才的一段代碼為例:
mod front_of_house {
mod hosting {
fn add_to_waitlist {}
fn seat_at_table {}
}
mod serving {
fn take_order {}
fn serve_order {}
fn take_payment {}
}
}
首先我們可以把front_of_house模塊下的內(nèi)容拆分出去,需要在src目錄下新建一個front_of_house.rs文件,然后把front_of_house模塊下的內(nèi)容寫到文件中。lib.rs文件中,只需要聲明front_of_house模塊即可,不需要具體的定義。聲明模塊時,將花括號即內(nèi)容改為分號就可以了。
mod front_of_house;
然后我們可以繼續(xù)拆分front_of_house模塊下的hosting模塊和serving模塊,這時需要新建一個名為front_of_house的文件件,在該文件夾下放置要拆分的模塊的同名文件,把模塊定義的內(nèi)容寫在文件中,front_of_house.rs文件同樣只保留聲明即可。
拆分后的文件目錄如圖:
本文主要講了Rust中Package、Crate、Module、Path的概念和用法,有了這些基礎(chǔ),我們后面才有可能開發(fā)一些比較大的項目。
ps:本文的代碼示例均來自the book(https://doc.rust-lang.org/book/ch07-00-managing-growing-projects-with-packages-crates-and-modules.html)。
版權(quán)聲明:本文為 CSDN博主「Jackyzhe」的原創(chuàng)文章。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。