开关

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,因此只会执行匹配的第一个案例。)