【问题标题】:CoffeeScript, Why do I need the explicit return on a conditionalCoffeeScript,为什么我需要有条件的显式返回
【发布时间】:2011-09-27 05:26:33
【问题描述】:

我正在尝试学习 CoffeeScript,并首次尝试了这个简单的课程:

class test    
  fib: (x) -> 
     x if x == 0 || x == 1   
     (this.fib x-1) + (this.fib x-2)

t = new test
alert(t.fib(6));

此代码不起作用,因为它是在 if 语句中没有返回语句的情况下编译的。这有效:

fib: (x) -> 
  return x if x == 0 || x == 1   
  (this.fib x-1) + (this.fib x-2)

为什么我需要明确的 return ?根据语言描述,尤其是http://jashkenas.github.com/coffee-script/#expressions,我预计x 表达式会被编译器转换为返回值。

【问题讨论】:

    标签: coffeescript


    【解决方案1】:

    您为什么希望 x 表达式转换为返回值?只有方法或函数中的 last 表达式被转换为返回值。

    在 Jeremy 的 if/then/else 示例中,有两个可能的最后一个表达式,coffeescript 解析器理解为 if/then/else 中的情况,这不是你在这里所拥有的:相反,你有一个没有左值的表达式,后跟另一个完全有效的表达式。 (关于if 语句本身是否是一个表达式存在一些讨论;可以说,它应该被视为一个表达式,但是if/then/else 的编译输出在then 子句中都包含一个return 关键字和else 子句。)

    编译器无法读懂你的想法。它不知道你对右值x 表达式的意图是什么。它所知道的只是在它后面有另一个在同一范围内完全有效的表达式。

    要达到你想要的效果:

    if x == 0 or x == 1
        x
    else 
        (@fib x-1) + (@fib x-2)
    

    或单行:

    if x == 0 or x == 1 then x else (@fib x-1) + (@fib x-2)
    

    【讨论】:

      【解决方案2】:

      这是因为 CoffeeScript 不知道 x if x == 0 || x == 1 行是一个返回语句。

      你想要的是

      class test
        fib: (x) ->
          if x == 0 || x == 1
            x
          else
            @fib(x-1) + @fib(x-2)
      

      编译成

      (function() {
        var test;
        test = (function() {
          function test() {}
          test.prototype.fib = function(x) {
            if (x === 0 || x === 1) {
              return x;
            } else {
              return this.fib(x - 1) + this.fib(x - 2);
            }
          };
          return test;
        })();
      }).call(this);
      

      没有else,条件不是函数的最后一个块,所以不会得到返回处理。

      【讨论】:

        猜你喜欢
        • 2021-01-17
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        相关资源
        最近更新 更多