11

私は最近、Coffeescript と Coffeescript コンソール、および Underscore を使い始めました。ただし、関数を定義するたびに、Coffeescript はそれが_その関数を意味すると判断し、 の初期割り当てを忘れているようです_ = require 'underscore'

なぜこれが起こるのですか?どうすれば防ぐことができますか?
(自分のファイルからコンソールに貼り付けコードをコピーできるようにしたいです。)

( _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
4

1 に答える 1

20

CoffeeScript REPL の中心には、次の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 を使用する場合は、.js 以外の名前にする必要があります_

Trevor Burnham (本を書いので信頼できると思います) に感謝し_ます。

REPL の機能
[...]
特殊変数_(アンダースコア) には、最後の式の結果が含まれます。

Ruby'sirbも同じことをします。

于 2012-06-11T02:50:48.133 に答える