使用CoffeeScript编写没有break的switch语句

19

在CoffeeScript中,是否可以使用不需要break的switch语句?

switch code                      switch (code) {
    when 37 then                     case 37: break;
    when 38 then           ->        case 38: break;
    when 39 then                     case 39: break;
    when 40                          case 40:
        ...                              ...

我以为这会有效,但失败了:

switch code
    when 37 then continue
    when 38 then continue  ->    not valid
    when 39 then continue
    when 40
        ...

75
你不想休息喝杯咖啡吗?(抱歉,我忍不住了) - Eonasdan
据我所知,不行。也许更详细地说明你想做什么会帮助我们想出一个合适的替代方案。 - Andrew Marshall
我完全确定使用硬编码break的switch语句是不好的。我现在将检查咖啡编译器的源代码。 - puchu
1
我想这是为了防止落入“穿透”情况。 - asawyer
3
C风格的switch/case语句中的case穿透长期以来一直被大多数人认为是一种反模式,并且会在忘记使用break时导致许多错误。如果您可以告诉我们为什么您认为穿透在您的情况下是必要的,我相信有人会告诉您如何以CoffeeScript的方式实现它。 - Aaron Dufour
@AaronDufour是正确的。你认为在什么情况下需要使用fall-through switch? - Sandro
4个回答

48

不是真的。根据文档

JavaScript中的Switch语句有些棘手。需要记得在每个case语句的结尾处添加break以避免意外落入默认情况。CoffeeScript可以防止意外的穿透,而且可以将switch转换为可返回、可分配的表达式。格式为:switch condition, when clauses, else the default case。

不过,如果要对待多个值相等,则可以在case中指定它们:

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

3
当 "去工作"、"去放松"、"去钓冰" 和 "去教堂" 使用相同的代码时,这是一种不好的方式。请注意,我已经尽力保持原意并使翻译通俗易懂。 - puchu
4
我不评论这是好还是坏——你问了关于CoffeeScript的问题,这是CoffeeScript的作者的想法。他不是唯一一个认为C风格的switch语句不好的人。即便如此,"when "Mon", "Tue", "Thu", "Sun"有什么不好的呢? - Linus Thiel
1
在Javascript中,switch语句与其他语言相同:只要不想评估下一个case,就必须在case结尾处使用break。我猜这是有意为之的,以便对其进行控制。 - challet
@challet - 不行。http://www.ruby-doc.org/core-2.1.4/doc/syntax/control_expressions_rdoc.html#label-case+Expression - ciastek
2
@ciastek 謝謝,你說得對。但我的主要觀點是“break”可以很有用。 - challet

12

你可以使用行继续符来帮助解决这个问题。例如:

name = 'Jill'

switch name
  when 'Jill', \
       'Joan', \
       'Jess', \
       'Jean'
    $('#display').text 'Hi!'
  else
    $('#display').text 'Bye!'

点此查看它的实际效果。


1
似乎是解析器失败了,应该自动允许以逗号结尾的行继续下去,还是我在臆想?(评论代码中的\续行符) - Mark Essel

4

完全可以做到,只需使用经典的JavaScript,并通过反引号传递它

`
switch (code) {
    case 37:
    case 38:
    case 39:
    case 40:
        // do the work of all four
    default:
        //default
}
`

2

这个问题很老了,但是如果将逗号放在下一行,它就能按预期工作,而不需要像 @Ron Martinez 显示的反斜杠连续换行。

switch code
  when 37
     , 38
     , 39
     , 40
    console.log "Some Number"
  else
    console.log "Default"

这将编译为:

switch (code) {
  case 37:
  case 38:
  case 39:
  case 40:
    return console.log("Some Number");
  default:
    return console.log("Default");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接