2012-06-11 8 views
11

Acabo de empezar a utilizar Coffeescript y la consola de Coffeescript y subrayar. Sin embargo, cada vez que defino una función, Coffeescript decide que _ significa esa función, y parece olvidar la asignación inicial de _ = require 'underscore'.Underscore no funciona en la consola de Coffeescript

¿Por qué sucede esto? ¿Cómo puedo prevenirlo?
(realmente me gustaría ser capaz de copiar pegar el código de mis archivos en la consola.)

(no _ tienen un significado especial en la consola CoffeeScript? ¿Quiere decir "el último resultado" o algo así? Eso lo explicaría mi problema)

Detalles:?

$ 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 

Respuesta

20

El CoffeeScript REPL tiene this JavaScript en su corazón:

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); 
} 

Entonces, si el último comando devolvió algo, entonces _ será ese algo. No puedo encontrar ninguna documentación sobre esto, pero buscar _ no es una actividad terriblemente productiva. Si desea utilizar Underscore.js en CoffeeScript REPL, tendrá que llamarlo de otra manera que no sea _.

Gracias a Trevor Burnham (que escribieron the book así que creo que podemos confiar en él en esto) sabemos que el CoffeeScript REPL utiliza _ como el último resultado que coincida con el comportamiento de la node.js REPL:

REPL Características
[...]
La variable especial _ (guión bajo) contiene el resultado de la última expresión.

Ruby's irb hace lo mismo.

+3

Derecha, respuesta corta: '_' en verdad significa" último resultado ". Esto no está documentado muy bien, pero se hace para mantener la coherencia con el 'node' REPL. Por desgracia, esto significa que tendrás que asignar un guión bajo a algún otro identificador. –

+2

Creo que la mejor práctica ha sido usar '__' (dos guiones bajos) para subrayar en CoffeeScript REPL:' __ = requerir 'subrayado'' – robbrit

+3

Esto es bastante frustrante al copiar/pegar código existente en el REPL. Lo mejor que he encontrado es establecer '__ = requerir" guión bajo "', y luego escribir '__ ' en el REPL antes del código que quiera ejecutar. ('__ ' devolverá el guión bajo, por lo que '_' apuntará a la biblioteca de guiones bajos para el próximo comando que se ejecuta). –

Cuestiones relacionadas