【问题标题】:Ternary operation in CoffeeScriptCoffeeScript 中的三元运算符
【发布时间】:2012-04-26 03:03:36
【问题描述】:

我需要将值设置为 a,这取决于条件。

使用 CoffeeScript 执行此操作的最短方法是什么?

例如这就是我在 JavaScript 中的做法:

a = true  ? 5 : 10  # => a = 5
a = false ? 5 : 10  # => a = 10

【问题讨论】:

  • 我希望咖啡脚本能支持三元运算符语法,它比if else then 更短更容易阅读
  • @AJP 我认为三元组会使咖啡变得不像 Ruby 那样,尽管 Ruby 有。咖啡的目标始终是可读性和圆角。
  • @jcollum 同意,但我发现最令人不安的是 a = true ? 5 : 10 是有效的咖啡脚本,但并不意味着三元结构,而是(在 javascript 中)它意味着:a = true ? true : {5:10} 这是已知的as a bad thing® 另外 a = false ? {5 : 10} in coffeescript then (in javascript) 相当于:a = true ? false : {5:10} 对于它的价值,我不认为它是好的。
  • 最好为 CoffeeScript 写出 if..then..else。这 ?作为存在运算符很有意义:beast = yeti ? "bear"if yeti? then alert "It's a yeti!" 很好地使用了 ?
  • CoffeeScript 中不需要单独的三元运算符,因为 if/then/else 已经是一个表达式并且做同样的事情。如果您真的缺少它,那么您宁愿习惯于 C 或 JavaScript 语法,也不愿真正需要它。如果它的可读性不够,并且有时确实会发生,只需将整个表达式括在括号中即可。正如@PaulOliver 所述,操作员? 已免于进行更多有用的检查,这些检查在JavaScript 中不存在。存在算子是最好的。

标签: javascript coffeescript ternary-operator


【解决方案1】:

由于一切都是表达式,因此会产生一个值,因此您可以使用 if/else

a = if true then 5 else 10
a = if false then 5 else 10

您可以查看更多关于表达式示例here

【讨论】:

  • 我猜coffeescript不支持javascript默认三元语法是有原因的?
  • 原因是创作者偏爱“不那么神秘”和不那么随意的东西(例如,github.com/jashkenas/coffeescript/issues/11#issuecomment-97802)。 [我的 2 美分 - 虽然我意识到 ?: 的任意性,但我认为 if..then..else 过于冗长,无法替代应该是简洁的表达方式。而且 ?: 毕竟是许多语言中非常根深蒂固的标准,其中包括 JavaScript。尽管如此,在这个阶段似乎已经一成不变。]
  • 我同意CoffeeScript作者的观点,我一直认为三元语法是丑陋且不直观的AF。如果您可以在同一行中使用if then else,请执行此操作,它是额外的 7 个字符,更加清晰和优雅。
  • 取决于口味,但我更喜欢符号而不是关键字,例如 -> 而不是 function{ } 而不是 begin .. end,因为我喜欢看到高信号噪声比,其中的字是为特定功能的逻辑保留的,而操作逻辑大多归为符号。
  • 移除非常标准的跨语言结构的整个驱动器实际上只会让正在维护的人感到困惑,尤其是当您添加其他“有用”的东西时,例如 pug ...如果你不能推断所有参数序列和鬼括号...
【解决方案2】:
a = if true then 5 else 10
a = if false then 5 else 10 

documentation

【讨论】:

    【解决方案3】:

    在几乎任何语言中,这应该可以代替:

    a = true  && 5 || 10
    a = false && 5 || 10
    

    【讨论】:

    • 这行得通,但还不够清晰,没有理由用任何语法更好的语言来做。
    • 这在许多语言中是不等价的,其中隐式转换为 false 的值,例如 0、null、未定义……等等
    • @Ibrahim 仅当&& 标记之后的部分为真时,它作为条件三元组起作用,否则它将返回最后一部分,这不是条件三元组的工作方式.
    • 确切地说,区别! :)
    • 在所有示例中,这是我发现在我可能遇到的任何给定语言中最难以分辨变量是什么的示例——尤其是像 CoffeeScript(或 Ruby)这样的语言,其中空格'不总是空格
    【解决方案4】:

    如果它主要是真正的用途,你也可以写成两个语句:

    a = 5
    a = 10 if false
    

    如果您需要更多可能性,或者使用 switch 语句:

    a = switch x
      when true then 5
      when false then 10
    

    如果是布尔值,它可能会过大,但我觉得它非常易读。

    【讨论】:

      【解决方案5】:

      Coffeescript 不支持 javascript 三元运算符。 以下是咖啡脚本作者的原因:

      我和下一个人一样喜欢三元运算符(可能有点 更多,实际上),但语法并不是让它们变得更好的原因——它们是 很棒,因为它们可以将 if/else 放在一行中作为 表达。

      它们的语法只是另一个需要记忆的神秘魔法, 与该语言中的其他任何东西都没有相似之处。结果相等, 我宁愿让if/elses 总是看起来一样(并且总是 编译成表达式)。

      所以,在 CoffeeScript 中,即使是多行 if 也会编译成三元组 在适当的时候,不带 else 子句的 if 语句也一样:

      if sunny   
        go_outside() 
      else   
        read_a_book().
      
      if sunny then go_outside() else read_a_book()
      

      都变成三元组,都可以用作表达式。它是一致的,不需要学习新的语法。所以,谢谢你的建议,但我要关闭这个 票证为“wontfix”。

      请参考github问题:https://github.com/jashkenas/coffeescript/issues/11#issuecomment-97802

      【讨论】:

        【解决方案6】:

        多行版本(例如,如果您需要在每行之后添加注释):

        a = if b # a depends on b
        then 5   # b is true 
        else 10  # b is false
        

        【讨论】:

          【解决方案7】:

          CoffeeScript 没有三元运算符。文档是这么说的。

          你仍然可以使用类似的语法

          a = true then 5 else 10
          

          清晰多了。

          【讨论】:

            【解决方案8】:

            类似于quotesBro 的answer,但没有then 关键字。这是一个使用普通的多行 if 语句的版本。对我来说,它的格式很好。

            考虑这个正常的 if 语句

            if true
                # do stuff
            else
                # do stuff
            

            然后将其用于赋值(同样,没有then 关键字)

            value = if true
                5
            else
                10
            
            value = if false
                5
            else
                10
            

            这编译成 javascript 就像一个普通的三元组

            value = true ? 5 : 10;
            value = false ? 5 : 10;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-10-06
              • 1970-01-01
              • 2021-08-01
              • 2018-09-10
              相关资源
              最近更新 更多