0

数学演算を行うための一連の coffeescript ファイルを作成しており、いくつかのテストを作成する必要があります。モカとチャイがいいと思います。現時点では、名前空間メソッドを使用して、すべての個別の関数をグループ化して、整理しておきます。

namespace = (target, name, block) ->
  [target, name, block] = [(if typeof exports isnt 'undefined' then exports else window), arguments...] if arguments.length < 3
  top    = target
  target = target[item] or= {} for item in name.split '.'
  block target, top

exports? exports.namespace = namespace

現時点でテストしたいのは、次のようなマトリックス クラスです。

namespace "CoffeeMath", (exports) ->

  class exports.Matrix4
    for name in ['add', 'subtract', 'multiply', 'divide', 'addScalar', 'subtractScalar', 'multiplyScalar', 'divideScalar', 'translate']
        do (name) ->
          Matrix4[name] = (a,b) ->
          a.copy()[name](b)

    Matrix4.DIM = 4

    # Take a list in column major format
    constructor: (@a=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]) ->
      # etc etc ...

これで、素敵な coffeescript コンパイラーでこれらすべてをコンパイルできます。次のようなテストがあります。

chai = require 'chai'
chai.should()

{namespace} = require '../src/aname'
{Matrix4} = require '../src/math'

describe 'Matrix4 tests', ->
  m = null
  it 'should be the identity matrix', ->
    m  = new exports.Matrix4()
    m.a.should.equal '[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]'

問題は、次のエラーが表示されることです。

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
ReferenceError: namespace is not defined
    at Object.<anonymous> (/Users/oni/Projects/Saito.js/src/math.coffee:3:3)
    at Object.<anonymous> (/Users/oni/Projects/Saito.js/src/math.coffee:631:4)
    at Module._compile (module.js:441:26)

aname を含める必要があり、名前空間関数をエクスポートするので、名前空間が定義されていない理由がわかりません。何かご意見は?

4

1 に答える 1

1

細かいマニュアルから:

オブジェクトをエクスポートするには、特別なオブジェクトに追加しexportsます。

そして、exportsによって返されrequireます:

module.exportsrequire呼び出しの結果として実際に返されるオブジェクトです。

だから、あなたがこれを言うとき:

namespace = require '../src/aname'

テスト内で利用できますnamespace.namespace

CoffeeScript は、各ファイルを関数ラッパーでラップして、グローバル名前空間の汚染を回避します。

すべての CoffeeScript 出力は無名関数でラップされます。 (function(){ ... })();この安全ラッパーは、キーワードの自動生成と組み合わされて、var偶然にグローバル名前空間を汚染することを非常に困難にします。

これは、コンパイルされた JavaScript に次のようなものがあることを意味します。

(function() {
    exports.namespace = ...
})();
(function() {
    # Matrix4 definition which uses the 'namespace' function
})();
(function() {
    var namespace = ...
})();

その結果、テスト以降にnamespace定義した場所には表示されず、別の関数に存在するため、別のスコープに存在します。Matrix4Matrix4

namespace数学ファイル内で使用する場合は、数学ファイルrequireのコードではなく、そこに使用する必要がありrequireます。

于 2012-05-12T17:16:30.243 に答える