開關

TL; DR: CoffeeScript switch 語句對每種情況使用 when,對於預設情況使用 else。他們將 then 用於單行案例,並使用逗號來表示具有單一結果的多個案例。他們故意不允許穿透,因此不需要明確的 break(因為它總是隱含地存在)。switch 語句可用作可返回的可分配表示式。

CoffeeScript switch 語句是一種控制語句,允許你根據值執行不同的操作。它們就像 if 語句,但是如果 if 語句通常根據 truefalse 是否採取兩種動作中的一種,則 switch 語句根據任何表示式的值採取任意數量的動作之一 - 字串,數字或任何內容一點都不

CoffeeScript switch 以關鍵字 switch 開頭,然後開啟表示式。然後,每個案例由關鍵字 when 表示,後跟該案例的值。

switch name
  when "Alice"
    # Code here will run when name is Alice
    callAlice()
  when "Bob"
    # Code here will run when name is Bob
    giveBobSandwich()

當每個案例是一行時,還有一個簡寫語法,使用 then 關鍵字而不是換行符:

livesLeft = 2
switch livesLeft
  when 3 then fullHealth()
  when 2 then healthAt 2
  when 1 then healthAt 1
  when 0 then playerDie()

你可以根據需要混合和匹配這兩種格式:

livesLeft = 2
switch livesLeft
  when 3 then fullHealth()
  when 2 then healthAt 2
  when 1
    healthAt 1
    alert "Warning! Health low!"
  when 0 then playerDie()

雖然最常見的事情是變數(如上例所示)或 functoin 的結果,但你可以開啟你選擇的任何表示式:

indexOfAnswer = 0
switch indexOfAnswer + 1
  when 1 then console.log "The answer is the 1st item"
  when 2 then console.log "The answer is the 2nd item"
  when 3 then console.log "The answer is the 3rd item"

你也可以讓多個案例導致相同的操作:

switch password
  when "password", "123456", "letmein" then console.log "Wrong!"
  when "openpoppyseed" then console.log "Close, but no cigar."
  when "opensesame" then console.log "You got it!"

一個非常有用的功能是預設或全部捕獲的情況,只有在沒有滿足其他條件時才會執行。CoffeeScript 用 else 關鍵字表示這一點:

switch password
  when "password", "123456", "letmein" then console.log "Wrong!"
  when "openpoppyseed" then console.log "Close, but no cigar."
  when "opensesame" then console.log "You got it!"
  else console.log "Not even close..."

(請注意,else 案例不需要 then 關鍵字,因為沒有條件。)

現在這裡是 switch 的所有功能的一個例子!

switch day
  when "Mon" then go work
  when "Tue" then go relax
  when "Thu" then go iceFishing
  when "Fri", "Sat"
    if day is bingoDay
      go bingo
      go dancing
  when "Sun" then go church
  else go work

你還可以將案例的條件設為表示式:

switch fullName
  when myFullName() then alert "Doppelgänger detected"
  when presidentFirstName + " " + presidentLastName
    alert "Get down Mr. president!"
    callSecretService()
  when "Joey Bonzo" then alert "Joey Bonzo everybody"

CoffeeScript switch 語句也有一個獨特的特性:它們可以像函式一樣返回值。如果將一個變數賦值給 switch 語句,那麼它將被賦值,無論語句返回什麼。

address = switch company
  when "Apple" then "One Infinite Loop"
  when "Google" then "1600 Amphitheatre Parkway"
  when "ACME"
    if isReal
      "31918 Hayman St"
    else
      "Unknown desert location"
  else lookUpAddress company

(請記住,隱式返回塊中的最後一個語句。你也可以手動使用 return 關鍵字。)

switch 語句也可以在沒有控制表示式的情況下使用,將它們轉換為 if / else 鏈的更清晰的替代方法。

score = 76
grade = switch
  when score < 60 then 'F'
  when score < 70 then 'D'
  when score < 80 then 'C'
  when score < 90 then 'B'
  else 'A'

(這在功能上等同於 grade = switch true,因為評估到 true 的第一個案例將匹配。但是,由於每個案例在結尾隱含地都是 breaks,因此只會執行匹配的第一個案例。)