2012-06-11 47 views
11

我剛開始使用Coffeescript和Coffeescript控制檯以及Underscore。然而,無論何時我定義一個函數,Coffeescript都認爲_意味着這個函數,並且似乎忘記了_ = require 'underscore'的初始賦值。Underscore在Coffeescript的控制檯中不起作用

爲什麼會發生這種情況?我怎樣才能防止它?
(我真的希望能夠從我的文件複製粘貼代碼到控制檯)。

(是否_必須在CoffeeScript的控制檯一些特殊的含義?這是否意味着「最後的結果」什麼?那會解釋我的問題)

詳情:

$ coffee 
coffee> _.contains [1, 2, 3], 3 # no Underscore, initially 
TypeError: Cannot call method 'contains' of undefined 
    at ... 
coffee> 
coffee> _ = require 'underscore' 
{ [Function] 
    _: [Circular], 
    VERSION: '1.3.3', 
    forEach: [Function], 
    ... 

coffee> _.contains [1, 2, 3], 3 # now Underscore works fine 
true 
coffee> 
------> someFunction = (a, b) -> # define a function ... 
......> a + b 

[Function] 
coffee> 
coffee> _.contains [1, 2, 3], 3  # now `_` is not Underscore any more! 
TypeError: Object function (a, b) { # Does `_` mean "last result" or sth? 
    return a + b; 
} has no method 'contains' 
    at evalmachine.<anonymous>:3:7 
    at Object.eval (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:142:17) 
    at Interface.<anonymous> (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/repl.js:131:40) 
    at Interface.emit (events.js:67:17) 
    at Interface._onLine (readline.js:162:10) 
    at Interface._line (readline.js:426:8) 
    at Interface._ttyWrite (readline.js:603:14) 
    at ReadStream.<anonymous> (readline.js:82:12) 
    at ReadStream.emit (events.js:88:20) 
    at ReadStream._emitKey (tty.js:327:10) 
coffee> 
coffee> _ = require 'underscore' 
coffee> _.contains [1, 2, 3], 3 # Now all is fine again, for a short while 
true 

回答

20

的CoffeeScript的REPL有this JavaScript在它的心臟:

try { 
    _ = global._; 
    returnValue = CoffeeScript["eval"]("_=(" + code + "\n)", { 
    filename: 'repl', 
    modulename: 'repl' 
    }); 
    if (returnValue === void 0) { 
    global._ = _; 
    } 
    repl.output.write("" + (inspect(returnValue, false, 2, enableColours)) + "\n"); 
} catch (err) { 
    error(err); 
} 

所以,如果最後一個命令返回的東西,然後_將是那樣的。我找不到任何有關此文件,但尋找_是不是一個非常有成效的活動。如果您想在CoffeeScript REPL中使用Underscore.js,則必須將其稱爲_以外的內容。

感謝Trevor Burnham(誰寫the book所以我認爲我們可以相信他對這個)我們知道,CoffeeScript的REPL使用_作爲最後的結果相匹配的node.js REPL的行爲:

REPL特點
[...]
特殊變量_(下劃線)包含最後一個表達式的結果。

Ruby's irb也做同樣的事情。

+3

正確,簡短的回答:'_'確實意味着「最後的結果」。這沒有很好的記錄,但它是爲了與'node' REPL保持一致而完成的。唉,這意味着你必須將Underscore映射到其他標識符。 –

+2

我認爲最好的做法是在CoffeeScript REPL中使用'__'(兩個下劃線)作爲Underscore:'__ = require'underscore'' – robbrit

+3

將現有代碼複製/粘貼到REPL時,這非常令人沮喪。我發現的最好的事情是設置'__ = require'下劃線「',然後在REPL中輸入'__ ',然後執行任何代碼。 ('__ '將返回下劃線,所以'_'將指向下一個運行的命令的下劃線庫。) –