要宣告一個變數,請使用=賦值運算子。
在 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
在這道練習中,你會寫程式碼,幫助自己照著最愛的食譜做出美味的千層麵。
你有四個任務,全都和烹煮千層麵所花費的時間有關。
在Lasagna類別中定義EXPECTED_MINUTES_IN_OVEN常數,用來儲存千層麵應該在烤箱中待幾分鐘。
根據食譜,預期的烤箱時間是 40 分鐘:
Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40
定義Lasagna#remaining_minutes_in_oven方法,它接受千層麵實際待在烤箱中的分鐘數作為參數,並根據上一個任務的預期烤箱時間,回傳千層麵還需要在烤箱中待幾分鐘。
Lasagna.new.remaining_minutes_in_oven(30)
# => 10
定義Lasagna#preparation_time_in_minutes方法,它接受你加在千層麵中的層數作為參數,並回傳你花在準備上的分鐘數,假設每一層需要 2 分鐘準備。
Lasagna.new.preparation_time_in_minutes(2)
# => 4
定義Lasagna#total_time_in_minutes方法,它接受兩個具名參數:number_of_layers參數是你加在千層麵中的層數,而actual_minutes_in_oven參數是千層麵待在烤箱中的分鐘數。
這個方法應該回傳你烹煮千層麵所花費的總分鐘數,也就是準備時間的分鐘數,加上千層麵目前為止待在烤箱中的時間。
number_of_layers = 3
actual_minutes_in_oven = 20
Lasagna.new.total_time_in_minutes(number_of_layers, actual_minutes_in_oven)
# => 26