學習軌道
/
Crystal
Crystal
/
練習
/
Ary 的驚奇千層麵
Ary 的驚奇千層麵

Ary 的驚奇千層麵

學習練習

簡介

開始入門

變數

要宣告一個變數,請使用=賦值運算子。 在 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

說明

在這道練習中,你會寫程式碼,幫助自己照著最愛的食譜做出美味的千層麵。

你有四個任務,全都和烹煮千層麵所花費的時間有關。

1. 定義預期的烤箱時間(分鐘)

在Lasagna類別中定義EXPECTED_MINUTES_IN_OVEN常數,用來儲存千層麵應該在烤箱中待幾分鐘。 根據食譜,預期的烤箱時間是 40 分鐘:

Lasagna::EXPECTED_MINUTES_IN_OVEN
# => 40

2. 計算剩餘的烤箱時間(分鐘)

定義Lasagna#remaining_minutes_in_oven方法,它接受千層麵實際待在烤箱中的分鐘數作為參數,並根據上一個任務的預期烤箱時間,回傳千層麵還需要在烤箱中待幾分鐘。

Lasagna.new.remaining_minutes_in_oven(30)
# => 10

3. 計算準備時間(分鐘)

定義Lasagna#preparation_time_in_minutes方法,它接受你加在千層麵中的層數作為參數,並回傳你花在準備上的分鐘數,假設每一層需要 2 分鐘準備。

Lasagna.new.preparation_time_in_minutes(2)
# => 4

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
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Crystal Exercism

準備好開始 Ary 的驚奇千層麵 了嗎?

註冊 Exercism,透過 26 個概念142 個練習 和真人引導來學習並精通 Crystal,全部免費。