1

渡された引数に基づいて、関数でいっぱいのテーブルを返すモジュールを開発しています。具体的には、モジュールは、顧客がどの顧客であるかに応じてデータセットに適用する必要がある一連のデータ変換ルール (関数) を返します。それを送る。

どのルールを適用するかを決定するコード (config ロジック) からルール ライブラリ (biz ロジック) を切り離すことにしました。

私のシナリオの 1 つに基づいて、ruleBuilder が正しいルール (関数) を追加していることを確認するために、私が書いている単体テストを次に示します。

ruleBuilder = require("ruleBuilder")
ruleLibrary = require("ruleLibrary")
local rules = ruleBuilder.assembleRules("Customer1231")

assert(rules[1] == ruleLibrary.missingSSNRule)

これはその検証を行う正​​しい方法ですか?ruleLibrary.missingSSNRule関数がクロージャーまたはパラメーターを介して他のいくつかの関数への参照を持っている場合でも、これは機能しますか?

4

2 に答える 2

2

テーブルに特定の関数が含まれていることを確認するには、Lua テーブルのキーは何でも (関数を含む) 使用できるという事実を利用できます。assembleRulesコードでは、次のように記述できます。

function assembleRules(...)
  ...
  return {
    [someOtherCoolModule.coolFunction] = someOtherCoolModule.coolFunction,
    [yetAnotherModule.anotherFunction] = yetAnotherModule.anotherFunction,
  }
end

その後、キーが存在するかどうかを簡単に確認できます。

local rules = ruleBuilder.assembleRules("somedata")
assert(rules[someOtherCoolModule.coolFunction])
于 2012-09-20T00:08:36.327 に答える
1

の戻り値が、その戻り値の0 番目のインデックス (注: Lua は 1 ベースのインデックスを使用します。インデックスとして 0 を使用しないでください)ruleBuilder.assembleRulesに配置することを何らかの形で知っていると仮定すると、はい。someOtherCoolModule.coolFunction

someOtherCoolModule.coolFunction がクロージャーであっても、これは機能しますか?

Luaのすべての関数はクロージャーです。ruleBuilder.assembleRulesただし、それが新しい機能を取りsomeOtherCoolModule.coolFunction、それを中心に構築することを意味していると仮定します。

関数はそれ自体と等しい。しかし、それは自分自身に等しいだけです。2 つのテーブルが同じテーブル オブジェクトである場合にのみ等しいのと同様に、2 つの関数は同じ関数である場合にのみ等しくなります。関数は、同じ関数の別のインスタンス化と同等ではなく、他の関数とも同等ではありません。この例を次に示します

于 2012-09-20T00:02:07.723 に答える