2011-09-26 62 views
1

我努力學習的CoffeeScript,並取得了這個簡單的類作爲第一次嘗試明確的返回:的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語句中的return語句。這工作:

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

爲什麼我需要明確的回報?根據語言描述,特別是http://jashkenas.github.com/coffee-script/#expressions,我預計x表達式會被編譯器轉換爲返回值。

回答

7

您爲什麼期望x表達式轉換爲回報?只有最後的表達式在方法或函數中被轉換爲返回值。

在傑里米的if/then/else例如,有兩個可能的最後一個表達式,而CoffeeScript的分析器理解是這樣的一個if/then/else,這是不是你有什麼在這裏:不是,你有沒有左值表達式,緊接着又完美有效的表達。 (這裏也有一些討論,到if語句本身是否是一個表達式,可以說,它應該被解讀爲一個,而是一個if/then/else的編譯輸出包含在兩個then子句和else子句return關鍵字)。

編譯器無法讀取您的想法。它不知道你的意圖是與那個rvalue 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行是一個return語句。

你想要的是

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,條件是不是函數的最後一個塊,所以沒有得到回報治療。