Crystal 是一門編譯式的物件導向程式語言。 以下是這門語言的一些目標:
深受 Ruby 啟發的語法。
靜態型別檢查,但不需要指定變數或方法引數的型別。
可以透過在 Crystal 中撰寫繫結來呼叫 C 程式碼。
具備編譯期求值與程式碼生成,以避免樣板程式碼。
編譯成高效率的原生程式碼。
Crystal 的開發始於 2011 年,目標是創造一門兼具 Ruby 的優雅與生產力,以及編譯式語言的效能與型別安全的語言。 這門語言的編譯器最初是用 Ruby 撰寫的,但在 2013 年以 Crystal 重寫。 Ary Borenszweig、Juan Wajnerman 和 Brian Cardiff 共同開發並設計了這門語言。
要宣告變數,請使用=賦值運算子。
在 Crystal 中,變數應採用 snake_case 格式。
number = 1
puts number # => 1
number = 2
puts number # => 2
常數使用相同的=賦值運算子宣告,但使用全大寫字母,也就是 SCREAMING_SNAKE_CASE。
NUMBER = 1
puts NUMBER # => 1
將值指定給已定義的常數會導致編譯期錯誤。
NUMBER = 1
NUMBER = 2
# Error: already initialized constant NUMBER
Crystal 是一門編譯式語言,這表示每個變數或方法引數都會在編譯期被賦予型別。 編譯器能夠推斷變數或方法引數的型別。 不過,在某些情況下仍需明確指定型別。 需要設定型別的情況會在後續的概念中說明。
方法是一種將一組可重複使用的指令群組起來的方式。
在 Crystal 中,方法通常定義在類別、模組或結構內。
不過,方法也可以定義在類別、模組或結構之外。
方法使用def關鍵字宣告,後面接著方法名稱。
在 Crystal 中,方法應以 snake_case 命名。
當方法沒有任何引數時,可以省略括號。
要宣告方法的結束,必須使用end關鍵字。
def hello
puts "Hello World!"
end
對某個型別的變數或方法引數使用不存在的方法,會導致編譯期錯誤。
number = 1
number + "1"
# Error: no overload matches 'Int32#+' with type String
方法可以有引數。 引數是傳遞給方法的資料。 若要讓方法接受引數,必須指定引數的名稱。 在 Crystal 中,引數應以 snake_case 命名。 一個方法可以有多個引數,但引數之間必須以逗號分隔。
def hello(name)
puts "Hello #{name}!"
end
方法也可以有多個引數。 在這種情況下,引數之間必須以逗號分隔。
def hello(name, language)
puts "Hello #{name}! You are learning #{language}."
end
呼叫屬於類別、模組或結構的方法時,必須使用點運算子(.)。
格式應為:<ClassName>.<method_name>。
當方法不屬於類別、模組或結構時,只要寫出它的名稱就能呼叫它。
方法一律會隱含地回傳最後一個運算式的值。
當方法有引數時,在方法呼叫與定義中指定引數可以使用括號,如下所示:<method_name>(<argument_1>, <argument_2>, ...)。
當方法沒有引數時,應省略括號。
def hello(name)
"Hello #{name}!"
end
hello("Crystal")
# => Hello Crystal!
呼叫有多個引數的方法時,引數之間應以逗號分隔。 引數必須按照方法引數的相同順序提供。
def hello_language(name, language)
"Hello #{name}! You are learning #{language}."
end
hello_language("World", "Crystal")
# => Hello World! You are learning Crystal.
以錯誤的引數數量呼叫方法,會導致編譯期錯誤。
hello_language("Crystal")
# wrong number of arguments for 'hello_language' (given 1, expected 2)
在 Crystal 中,可以使用+運算子將兩個數字相加。
也可以使用-運算子將兩個數字相減。
還可以使用*運算子將兩個數字相乘。
1 + 1
# => 2
2 - 1
# => 1
2 * 2
# => 4
在 Crystal 中,註解是使用#字元撰寫,後面接著一個空格,然後是註解內容。
註解用來說明程式碼。
編譯器不會執行註解。
# This is a comment