位元詩人 [Raku] 程式設計教學:變數 (Variable)

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

本文說明 Raku 的變數。

實字 (Literal)

實字 (literal) 指的是在程式中直接寫死的資料,例如:

  • True (布林)
  • 3.14159 (數字)
  • "Hello World" (字串)
  • (1, 2, 3) (串列)

在初期的練習中,我們會用實字來生成程式要用的資料,這樣比較方便。但在實用的程式中,我們會由外部讀入資料,使用實字的機會就少一些。

宣告變數 (Variable)

在使用變數前,要先宣告變數。一般來說,使用 my 宣告變數,實例如下:

my $msg = "Hello World";
say $msg;

雖然 Raku 可以用 Unicode 字元宣告變數名稱,因 Unicode 無法直接用鍵盤打出來,建議還是使用英文字母來宣告變數。

選擇性的型別標註

Raku 是動態型態語言,但可選擇性地標註型別,若加入型別標註,Raku 會協助我們檢查變數的型別,型別錯誤時會引發程式錯誤。如以下反例:

my Str $v = "Hello World";

$v = 12345;  # Error.

say $v;

在此反例中,變數 $v 的型別已標註為 Str (字串),但我們使用整數 12345 重新賦值,這時會引發錯誤。

註:此特性為 gradual typing。

對於簡短的命令稿 (scripts),通常不會加上型別註記。若要開發套件或中大型程式,加入型別註記對於程式碼品質會有幫助。

宣告常數 (Constant)

對於常數,可改用 constant 宣告,避免無意間修改造成的錯誤,如以下反例會引發錯誤:

constant $pi = 3.14159;

$pi = 4;  # Error.

變數的前綴 (Sigil)

Sigil 是 Perl 家族程式語言的特色,用來當做變數的標註 (annotation),讓程式設計師一看就知道該變數的形態。

Raku 的變數使用四種 sigil:

  • $:用於純量 (scalar)
  • @:用於陣列 (array)
  • %:用於關連性陣列 (associative array)
  • &:用於副程式 (subroutine)

在 Perl 5 時,sigil 的規則比較複雜,初學 Perl 的程式人容易搞混。Raku 將 sigil 的規則簡化,變數不需要在不同形態間變換 sigil,同一個變數使用同一種 sigil 即可。

Raku 有許多影響變數可變範圍 (scope) 的語法,像是 twigil 或是其他的變數宣告關鍵字,一開始學習時,不需過度在意這些細節,先用 myconstant 宣告變數和常數即可。

特殊變數 (Special Variables)

Raku 有許多特殊變數,但和 Perl 5 的內建變數不同,大部分 Raku 的特殊變數是以字母來標示,比較好閱讀。僅有少數特殊變數用符號表示,如下:

  • $_:用於區塊的預設變數
  • $/:常規表示式比對的結果
  • $!:例外處理的結果

其他的特殊變數請參考 Raku 官網的文件

建立識別字 (Identifier)

變數名稱在程式中又稱為識別字 (identifier)。識別字原本是沒有意義的,是由程式撰寫者透過宣告變數的方式讓識別字產生意義。在 Raku,有以下三種風格的識別字命名方式:

  • PascalCase
  • camelCase
  • snake_case
  • kebab-case

Raku 沒有限制使用那一種變數命名風格,通常是在程式中選擇一種後就保持一致。比較特別的是 Raku 支援 kebab-case。這種命名法通常只會在 Lisp 家族語言看到。

一般程式設計書籍,傾向用簡短的變數名稱,像是 $var$n$i 等,這是為了便利性。但是,實際在撰寫程式時,使用有意義的名稱較易閱讀。以下是反例:

$var1 = $var2 * $var3;

雖然這個程式可正確運作,但從程式碼無法得知程式的意圖。將其改寫如下:

$monthly-salary = $daily-rate * $working-days;

對於電腦程式來說,兩個程式的意義相同,但本例較易閱讀,日後要維護也比較方便。

內部用變數,像是迴圈、副程式、類別等,可以用較短的名稱,但對外的變數,則以有意義的名稱較佳。

表達式 (Expression) 和敘述式 (Statement)

表達式 (expression) 指的是會回傳值的代碼,如下:

  • 42
  • "Hello"
  • $n + 1

敘述式 (statement) 則是指會產生某種效果的程式碼,如下:

  • my $n;
  • $n = 42;
  • say "Hello World";

大部分的程式語言,是以指令式 (imperative) 和物件導向 (object-oriented) 為主流範式 (paradigm);這兩類程式都是以撰寫敘述式為主。

關於作者

位元詩人 (ByteBard) 是資訊領域碩士,喜歡用開源技術來解決各式各樣的問題。這類技術跨平台、重用性高、技術生命長。

除了開源技術以外,位元詩人喜歡日本料理和黑咖啡,會一些日文,有時會自助旅行。