【问题标题】:Theoretical Coffeescript Switch Statement Conundrum理论 Coffeescript Switch 语句难题
【发布时间】:2015-08-10 04:15:10
【问题描述】:

前言

这可能没有真正的实现,但在阅读了another post on coffeescript's 2 switch usages 之后,我决定尝试一下,发现这个相当奇怪的问题。

咖啡脚本

type = 'guidance'

s = switch
  when type is 'guidance'
   'g'
  when type is 'vulnerability'
   'v'
  else
   'foo'

console.log s #g

转译的 javascript

var s, type;

type = 'guidance';

s = (function() {
  switch (false) {
    case type !== 'guidance':
     return 'g';
  case type !== 'vulnerability':
     return 'v';
  default:
     return 'foo';
 }
})();

console.log(s); //g

难题

我没有得到的是 case 表达式被编译为相反的值。 Coffeescript when type is 'guidance' 应该 转换为以下 javascript case type === 'guidance' 对吗?

如果您使用 s = switch true,则 case 表达式将正确呈现 case type === 'guidance'。不管渲染的 javaScript case 表达式如何,结果都是一样的。

【问题讨论】:

  • 请重新阅读您的问题。代码转换为您说它应该转换为的确切内容。
  • 这是复制粘贴的错字。已更正
  • 我不会说这是一个“难题”。转译结果有效,这正是 coffeescript 决定实现它的方式。

标签: javascript coffeescript switch-statement theory


【解决方案1】:

我不会将此称为问题,因为它按预期工作:-)

原因,我只能猜测(可能编译器中有一些cmets)。他们很可能需要将所有这些表达式转换为布尔值——他们希望它像if 语句一样工作,但switch 确实使用=== 运算符与给定值进行比较。所以你不能这样做

switch (true) {
    case 1: …
    case []: …
    case "true": …
}

因为这些都不起作用,而所有这些都是真实的值。所以你可以使用double not operator:

switch (true) {
    case !!( 1 ): …
    case !!( [] ): …
    case !!( "true" ): …
}

并且这些表达式中的任何一个都将匹配true。但是,您可以通过将外部 ! 移动到比较的另一侧 (!true) 来稍微减小代码大小,并获得等价的

switch (false) {
    case !( 1 ): …
    case !( [] ): …
    case !( "true" ): …
}

您可以在coffeescript docs 中看到这种确切的模式。现在,显然编译器足够聪明,可以将===== 表达式上的! 组合成!=!==,但这不适用于任意表达式。

如果你问我,他们应该把它编译成一系列if elses。

【讨论】:

    【解决方案2】:

    无论出于何种原因,Coffeescript 转译器都会生成一个switch 语句来匹配显式值false,而不是true。因此,case 表达式与when 子句所说的相反。当when 子句中的表达式为true 时,生成的switch 语句将选择case,因为它正在寻找相反 条件为false

    【讨论】:

    • 我无法深入了解为什么它会这样工作。
    • 这就是我想要的why...再说一遍,这只是talking shop,所以它不是真正有用的代码能够从表达式执行不同的上下文返回值。
    • @jusopi,如果您正在寻找为什么,可以访问freenode.net 上的#coffeescript 并在那里询问。
    猜你喜欢
    • 2010-12-20
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多