跳轉到內容

Raku 程式設計/變數和資料

來自 Wikibooks,開放世界中的開放書籍

靜態和動態程式語言

[編輯 | 編輯原始碼]

Raku 屬於一類被稱為動態語言的程式語言。動態語言使用資料型別可以在執行時改變的變數,並且不需要預先宣告。動態語言的替代方案是靜態語言,例如CJava,在靜態語言中,變數必須在使用前宣告為特定的資料型別。

在像 C 這樣的語言或它的衍生語言(例如C++C#Java)中,變數需要在使用前宣告為一個型別。

unsigned short int x;
x = 10;

上面的程式碼並不完全準確,因為在 C 中你可以在宣告變數時初始化它。

unsigned short int x = 10;

然而,變數 x 必須在宣告之前不能使用。一旦它被宣告為 unsigned short int 型別,你就不能使用 x 來儲存其他型別的資料,比如浮點數或資料指標,至少在沒有顯式強制轉換的情況下不能。

unsigned short int x;
x = 1.02;        /* Wrong! */
unsigned short int y;
x = &y;          /* Wrong! */

在像 Raku 這樣的動態程式語言中,變數可以在首次使用時自動分配,而無需顯式宣告。此外,Raku 中的變數是多型的:它們可以是整數、字串、浮點數或像陣列或雜湊表這樣的複雜資料結構,而無需任何強制轉換。以下是一些示例。

my $x;
$x = 5;           # Integer
$x = "hello";     # String
$x = 3.1415;      # Floating Point Number

上面的例子展示了一些我們在本書的其餘部分會討論的不同想法。一個重要的概念是註釋。註釋是原始碼中的筆記,旨在供程式設計師閱讀,並被 Raku 直譯器忽略。在 Raku 中,大多數註釋用 # 符號標記,並一直持續到行末。Raku 還具有嵌入式註釋和多行文件,我們將在後面討論這些內容。

我們對 Raku 資料並沒有完全誠實。Raku 確實允許資料被賦予顯式型別,如果你想要的話。預設情況下使用的是我們上面看到的這種多型資料,但你也可以宣告一個標量只能儲存整數、字串、數字或其他完全不同的資料項。我們將在後面詳細討論 Raku 的顯式型別系統。現在,更容易認為 Raku 中的資料沒有顯式型別(或者更具體地說,它不需要它們)。

我們上面看到的例子也展示了一個重要的關鍵字:mymy 用於宣告一個新的變數以供使用。我們將在後面詳細討論 my 及其用途。

變數和符號

[編輯 | 編輯原始碼]

正如我們在上面的簡短示例中所看到的,Raku 變數前面帶有符號,稱為符號。符號在許多重要的用途中發揮作用,但其中最重要的是建立上下文。Raku 有四種類型的符號,用於建立不同型別的資料。我們上面看到的 $ 符號用於標量:單個數據值,如數字、字串或物件引用。其他要使用的符號是 @,表示資料陣列,% 表示資料雜湊表,以及 & 表示子例程或可執行程式碼塊。

標量
正如我們已經看到的那樣,標量包含單個數據項,如數字或字串。
陣列
陣列是相同型別資料的列表,按數字索引。
雜湊表
雜湊表是由字串索引的、可能不同型別資料的集合。
程式碼引用
程式碼引用是指向可執行程式碼結構的指標,可以像資料一樣傳遞並可以在程式碼中的不同位置呼叫。

我們上面已經看到了一些標量的用法,這裡我們將展示一個稍微更全面的列表。

my $x;
$x = 42;             # Decimal Integer
$x = 0xF6;           # Hexadecimal Integer
$x = 0b1010010001;   # Binary Integer

$x = 3.1415;         # Floating Point Number
$x = 2.34E-5;        # Scientific Notation

$x = "Hello ";       # Double-Quoted String
$x = 'World!';       # Single-Quoted String
$x = q:to/EOS/;      # Heredoc string

This is a heredoc string. It starts at the "q:to"
term and continues until we reach the terminator
specified in quotes above. This is useful for
large multi-line string literals. We will talk about
heredocs in more detail later

EOS

$x = MyObject.new(); # Object Reference

標量是 Raku 中最基本和最基本的資料型別,並且可能是你在程式中使用最頻繁的型別。這是因為它們非常通用。

正如我們上面提到的,陣列是資料物件的列表,被認為是相同型別。由於陣列是標量的列表,因此陣列中的一些元素可以是數字,而另一些可以是字串,還有一些可以是其他資料。但是,這通常不被認為是陣列的最佳用法。

陣列以 @ 符號為字首,可以使用方括號 [] 中的整數進行索引。以下是一些使用陣列的示例。

my @a;
@a = 1, 2, 3;
@a = "first", "second", "third";
@a = 1.2, 3.14, 2.717;

一旦我們有了陣列,就可以使用索引符號提取陣列中的標量資料項。

my @a, $x;
@a = "first", "second", "third";
$x = @a[0];    # first
$x = @a[1];    # second
$x = @a[2];    # third

陣列也可以是多維的。

my @a;
@a[0, 0] = 1;
@a[0, 1] = 2;
@a[1, 0] = 3;
@a[1, 1] = 4;

# @a is now:
#       |1, 2|
#       |3, 4|

陣列也不必只儲存標量,它們也可以儲存任何其他資料項。

my @a, @b, @c, @d, %e, %f, %g, &h, &i, &j;
@a = @b, @c, @d;
@a = %e, %f, %g;
@a = &h, &i, &j;

這可以成為一些複雜資料結構的基礎,我們將在後面詳細討論如何組合這樣的結構。

雜湊表

[編輯 | 編輯原始碼]

雜湊表在許多方面類似於陣列:它們可以包含一組物件。但是,與陣列不同的是,雜湊表使用名稱而不是數字來標識它們的項。以下是一些示例。

my %a = "first" => 1, "second" => 2, "third" => 3;
my $x = %a{"first"};        # 1
my $y = %a{"second"};       # 2
my $z = %a{"third"};        # 3

特殊的 => 符號類似於逗號,只是它建立了一個。對是字串名稱和關聯資料物件的組合。雜湊表有時可以被認為是成對的陣列。還要注意,雜湊表使用花括號 {} 來索引它們的資料,而不是像陣列那樣使用方括號 []。

雜湊表還可以使用一種稱為自動引用的特殊語法,以幫助簡化雜湊表值的查詢。你可以在不使用花括號和引號 {" "} 的情況下,只使用尖括號 < > 來完成相同的工作。

my %a = "foo" => "first", "bar" => "second";
my $x = %a{"foo"};      # "first"
my $y = %a<bar>         # "second"

副詞語法

[編輯 | 編輯原始碼]

雜湊表中的對可以用另一種方法定義,而不使用 => 運算子。對也可以使用副詞語法定義。副詞語法在整個 Raku 中使用,用於提供命名資料值,因此它不僅僅對雜湊表有用。"name" => data 形式的對可以用副詞語法寫成 :name(data)

my %foo = "first" => 1, "second" => 2, "third" => 3;
my %bar = :first(1), :second(2), :third(3);       # Same!

我們將在整個 Raku 中看到副詞的許多用途,因此現在學習它們很重要。

$_ 預設變數

[編輯 | 編輯原始碼]

Raku 使用特殊變數 $_ 作為特殊的預設變數。$_ 在沒有提供其他變數時接收值,如果方法以點開頭,則由方法使用。$_ 可以透過名稱顯式使用或隱式使用。

$_ = "Hello ";
.print;           # Call method 'print' on $_
$_.print;         # Same
print $_;         # Same, but written as a sub;

given "world!" {  # Different way of saying $_ = "world"
    .print;       # Same as print $_;
}

預設變數在許多地方很有用,例如迴圈,它們可以用來清理程式碼並使操作更顯式。我們將在學習過程中進一步討論預設變數。

華夏公益教科書