1. 程式人生 > >Beginng_rust(譯):在終端上列印(第二章)

Beginng_rust(譯):在終端上列印(第二章)

在終端上列印

在本章中,您將學習:

  • 如何在Rust語言中編寫和執行您的第一個程式
  • 如何在終端上輸出文字和數字
  • 如何編寫一個小指令碼,使編譯器的輸出更具可讀性
  • 如何在程式碼中編寫註釋

如何開始

最短且有效Rust程式是:

fn main(){}

當然,它什麼都不做。 它只定義了一個名為“main”的空函式。 “函式”是指一組執行某些操作並且已經命名的指令。

“fn”字是“function”的簡寫。 “main”字是函式的名稱。 圓括號包含函式的可能引數; 在這種情況下,沒有引數。 要關閉,大括號包含構成函式體的可能語句; 在這種情況下,沒有宣告。

當執行用Rust編寫的程式時,執行其“main”b函式。 如果沒有主要的“main”函式,那麼它不是一個完整的程式; 但它可能是一個庫。

要執行此程式,請完成以下操作:

  • 安裝包含Rust編譯器及其實用程式的包。 編譯器可以從網站https://www.rust-lang.org免費下載。 可以使用處理器體系結構x86(32位)或x86-64(64位)的Linux,Windows或macOS平臺。 對於每個平臺,有三個版本:“穩定”(stable),“測試版(beta)”和“夜間(nightly)”。 建議使用“穩定”版本;它是最古老,也是最考驗和一個不太可能改變。 所有這些程式版本都應該從控制檯的命令列使用。安裝後,要檢查安裝的版本,請在命令列鍵入(使用大寫V):rustc -V。
  • 建立或選擇將儲存Rust練習的資料夾,並使用任何文字編輯器在該資料夾中建立名為“
    main.rs
    ”的資料夾,其中包含上述內容。
  • 在命令列的資料夾中,鍵入:rustc main.rs. 在建立名為“main”的檔案後,應立即打印出提示(在Windows環境中,它將命名為“main.exe”)。 實際上,“rustc”命令已經正確編譯了指定的檔案。 Tat是,它已經讀取並生成相應的機器程式碼,並且它已將此機器程式碼儲存在同一資料夾中。
  • 在命令列中,如果在Windows環境中鍵入:main對於其他作業系統,請鍵入:./ main。 您只需執行之前生成的程式,但應立即列印提示,因為此程式不執行任何操作。

Hello, World!

讓我們看看如何在終端上列印一些文字。 將上一節的程式更改為以下內容:

fn main() {
print!("Hello, world!");
}

如果它像以前一樣編譯並執行,它會打印出:“Hello,world!” 請注意,新新增的行包含八個語法項,即“標記”。 我們來看看它們:

  • print:它是Rust標準庫中定義的巨集的名稱。
  • !:它指定前面的名稱表示一個巨集。 沒有這樣的符號,列印將代替表示功能。 Tere在Rust標準庫中沒有這樣的函式,因此您將收到編譯錯誤。巨集是一個類似於函式的東西 - 它是與名稱相關聯的一些Rust程式碼。 通過使用此名稱,您要求在此處插入此類程式碼。
  • (:它啟動巨集的引數列表。
  • “:它啟動文字字串。
  • Hello,world!:它是文字字串的內容。
  • “:它結束文字字串。
  • ):它結束巨集的引數列表。
  • ;:結束陳述。 讓我們來看看“文字字串”短語的含義。 “字串”一詞的意思是“有限的字元序列,可能包括空格和標點符號”。 “文字”一詞的意思是“帶有直接在原始碼中指定的值。”因此,“文字字串”是“原始碼中直接指定的有限字元序列(可能包括空格和標點符號)”。

print巨集只是插入一些程式碼,在終端上列印作為引數接收的文字。

Rust總是區分大寫和小寫字母 - 它是“區分大小寫”。 對於文字字串和註釋之外的所有字元,如果使用小寫字母替換某些大寫字母或相反,通常會出現編譯錯誤,或者無論如何都會出現具有不同行為的程式。 相反,在文字字串中建立這樣的錯誤總是允許成功編譯,但是程式的行為可能會有所不同。 例如:

fn Main() {}

如果編譯此程式,則會出現編譯錯誤“未找到主函式”,因為程式中未定義主函式(帶小寫的m)。 從現在開始,除非指定,否則我們將假設示例程式碼將位於“main”函式的大括號內,因此將省略大括號和它們之前的文字。

列印文字字串的組合

您可以列印其中的幾個字串,而不是使用單個文字字串,即使在單個語句中也是如此。 通過這種方式:

print!("{}, {}!", "Hello", "world");

這句話放在“main”函式的大括號內,將再次列印:“你好,世界!”。

在這種情況下,print巨集接收三個引數,以逗號分隔。 所有三個引數都是文字字串。 但是,第一個字串包含兩對大括號({})。 它們是佔位符,表示插入其他兩個字串的位置。

因此,巨集在第一個之後掃描引數,並且對於每個引數,它檢視一對大括號的第一個引數,並用當前引數替換它們。

這類似於以下C語言語句:

printf("%s, %s!", "Hello", "world");

但是有一個重要的區別。 如果你試圖編譯:

print!("{}, !", "Hello", "world");

你得到編譯錯誤“引數從未使用過”,因為第一個之後的巨集的引數比第一個引數中的佔位符更多; 也就是說,有一些論點沒有任何相應的佔位符。

如果你試圖編譯:

print!("{}, {}!", "Hello");

你得到一個編譯錯誤,因為第一個引數中的佔位符比第一個引數後面的引數更多; 也就是說,有一個佔位符沒有任何相應的引數。

相反,C語言中的相應語句不會引發編譯錯誤,而是導致編譯的程式崩潰或行為異常。

列印幾行文字

到目前為止,我們編寫的程式只打印一行。 但是單個宣告可以列印幾行; 通過這種方式:

print!("First line\nSecond line\nThird line\n");
This will print:
First line
Second line
Third line

字元序列\ n,其中n代表“新行”,由編譯器轉換為表示當前使用的作業系統的行終止符的字元序列。

鑑於每個列印語句僅對新行進行一次,並且在語句結束時非常常見,另一個巨集“println”已新增到Rust標準庫中。 它以這種方式使用:

println!("text of the line");

該陳述相當於:

print!("text of the line\n");


呼叫此println巨集(其名稱將被讀作“print line”)等效於使用相同的引數呼叫print,然後輸出行終止符。

列印整數

如果我們要列印整數,我們可以輸入:

print!("My number: 140");

或者,使用佔位符和附加引數:

print!("My number: {}", "140");

或者,刪除第二個引數周圍的引號:

print!("My number: {}", 140);

所有這些陳述都將打印出:“我的號碼:140”。 在最後一個語句中,第二個引數不是文字字串,而是一個“文字整數”,或者簡稱為“文字整數”。

對於字串,整數是另一種資料型別。

即使對於整數,print巨集也可以使用它們來替換其第一個引數中的相應占位符。

實際上,編譯器將原始碼中包含的字串140解釋為以十進位制格式表示的數字,它以二進位制格式生成等效數字,然後將其儲存到可執行程式中。

在執行時,程式以二進位制格式獲取此數字,使用十進位制表示法將其轉換為字串“140”,然後用該字串替換佔位符,從而生成要列印的字串,最後將字串傳送到 終點站。

例如,此過程解釋了為什麼要編寫以下程式:

print!("My number: {}", 000140);

編譯器生成與之前生成的完全相同的可執行程式。 實際上,當源字串000140被轉換為二進位制格式時,忽略前導零。

引數型別也可以混合使用。 這個說法

print!("{}: {}", "My number", 140);

將列印與以前相同的行。 這裡第一個佔位符對應於文字字串,而第二個佔位符對應於文字整數。

命令列指令碼

上面顯示的rustc命令有一個缺點:它按照找到它們的順序列印它在程式碼中找到的所有錯誤。 好吧,通常你的程式碼會包含很多語法錯誤,你應該從第一個到最後一個處理它們。 但是在編譯器完成列印錯誤之後,您將面臨發現最後一個錯誤之前的新提示。 因此,您必須回滾到第一個錯誤。

改善這種情況的一種方法是使用命令列指令碼,其語法取決於作業系統。

在Linux系統中,您可以將以下行放在新的指令碼檔案中:

clear
rustc $* --color always 2>&1 | more

在Windows系統中,您可以將以下三行放在.BAT檔案中:

@echo off
cls
rustc %* --color always 2>&1 | more

如果指令碼檔名為rs(Windows上的rs.bat),要編譯名為main.rs的檔案,可以鍵入:

rs main.rs

該指令碼首先清除螢幕,然後使用您提供給它的所有引數執行rustc編譯器。 如果編譯成功,或者它生成的螢幕錯誤訊息少於一屏,那麼它的行為就像正常執行一樣。

否則,它會在螢幕上顯示錯誤訊息,然後停止並顯示 訊息 - 更多 - 在終端螢幕的底部。 此時你可以按:…

  • Enter鍵,前進一行。
  • Te Space鍵,以一屏為前提。
  • Te Q鍵(用於“退出”),中止列印錯誤訊息,然後返回到命令提示符。

註釋

編寫以下程式碼

// This program
// prints a number.
print!("{}", 34); // thirty-four
/* print!("{}", 80);
*/

這將列印34。

前兩行以一對斜槓“//”開頭。 這樣的一對字元表示“行註釋”的開始,結束於該行的結尾。 要在多行上寫註釋,必須在註釋的每一行重複這對斜槓,如上面程式的第二行所示。

Rust程式設計師使用雙斜槓後留空,以提高可讀性。

當它出現在第三行時,行註釋可能在語句後開始,通常由至少一個空格分隔。

還有另一種評論,在第四和第五行中舉例說明。 這樣的評論以字元對“/ ”開頭,以“ /”對結束; 它可以在幾行上擴充套件,因此它被命名為“多行註釋”。Rust程式設計師通常只使用單行註釋來避免生產程式碼中的多行註釋,並且僅使用多行註釋來暫時排除某些程式碼 來自編譯。

Rust註釋看起來與現代C語言註釋相同。 事實上,Rust註釋和C註釋之間存在重要區別:Rust註釋可能是巢狀的,並且它們必須正確巢狀。

/* This is /* a valid*/
comment, even /* if /* it contains
comments*/ inside */itself. */
/* This /* instead is not allowed in Rust,
while in C is tolerated (but it may generate a warning).*/