咖啡脚本中的 switch case 语句

Posted

技术标签:

【中文标题】咖啡脚本中的 switch case 语句【英文标题】:Switch case statement in coffee script 【发布时间】:2014-05-27 14:18:39 【问题描述】:

我有几个不同的按钮调用相同的函数,我希望将它们包装在 switch 语句中,而不是使用一堆 else if 条件。任何帮助都会很棒!!!

events:
"click .red, .blue, #black, #yellow" : "openOverlay"

openOverlay: (e) ->
  e.preventDefault()
  e.stopPropagation()

target = $(e.currentTarget)

# the view should be opened
view = 
  if target.hasClass 'red' then new App.RedView
  else if target.hasClass 'blue' then new App.BlueView
  else if target.is '#black' then new App.BlackView
  else
    null

# Open the view
App.router.overlays.add view: view if view?

【问题讨论】:

无论如何都不适合switch语句(hasClass vs is)。 【参考方案1】:

CoffeeScript 中有两种形式的switch

switch expr
    when expr1 then ...
    when expr2 then ...
    ...
    else ...

和:

switch
    when expr1 then ...
    when expr2 then ...
    ...
    else ...

第二种形式可能对您有所帮助:

view = switch
  when target.hasClass 'red' then new App.RedView
  when target.hasClass 'blue' then new App.BlueView
  when target.is '#black' then new App.BlackView
  else null

如果undefinedview 的可接受值,您可以省略else null。您还可以将逻辑包装在(显式)函数中:

viewFor = (target) ->
    # There are lots of ways to do this...
    return new App.RedView   if(target.hasClass 'red')
    return new App.BlueView  if(target.hasClass 'blue')
    return new App.BlackView if(target.is '#black')
    null

view = viewFor target

给你的逻辑一个名字(即将它包装在一个函数中)通常有助于澄清你的代码。

【讨论】:

请注意,then 必须用于单行赋值。如果您在下面编写代码,请不要输入then,否则它将在编译过程中失败。【参考方案2】:

除了the accepted answer中的细节,CoffeeScript中的switch语句还支持,提供多个匹配结果:

switch someVar
    when val3, val4 then ...
    else ...

或(如果您的语句有多行):

switch someVar
    when val3, val4
        ...
    else
        ...

【讨论】:

我不认为or 就在这里——它会创建case (val1 || val2): 声明——即。在val1val2 上运行布尔运算——这不是我所期望的。 , 可以解决问题。 @Voy:你是对的 - or 不会产生预期的结果。答案已更新

以上是关于咖啡脚本中的 switch case 语句的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的Switch-case语句

在 Switch 中的 Case 语句中添加附加条件

优化:switch 语句中的 case 顺序重要吗? [关闭]

switch case 语句中的分号

switch 语句中的多个情况

Java中的switch-case语句