私は Java と Ruby のバックグラウンドを持っていますが、Erlang に「method_missing」に相当するものがあるかどうか疑問に思っていました。私はドキュメントを見てきましたが、最も近いのはerl_evalとerl_parseの使用ですが、他に方法があるかどうか知りたいですか?
5 に答える
未定義の関数を呼び出そうとすると呼び出される「error_handler」モジュールがあります。
process_flag(error_handler, Module).
モジュールは、エクスポートする必要がundefined_function/3
ありundefined_lambda/3
ます。これを標準ハンドラ モジュールで実装する方法を確認できますerror_handler
。
error_handler
標準のコード ローディング システムを壊さないように注意する必要があります。Erlang は通常、未定義の関数エラーからモジュールをロードし、あきらめてエラーを通知する前に関数を再実行しようとします。通常、最初に標準の error_handler を試して、それが失敗した場合は新しい動作にフォールバックします。
「防御コーディング」に興味がある場合は、呼び出しModule:module_info(exports)
て、呼び出しようとしている関数がエクスポートされているかどうかを確認できます。
Erlang にはメソッドではなく関数があり、一般に未定義の関数を呼び出そうとするとエラーと見なされます。
同じモジュール内で存在しない関数を呼び出そうとすると、コンパイラはエラーを生成します。別のモジュールで関数を呼び出そうとすると、実行時にエラー、エラーが生成されundef
ます。このようなエラーをどのように処理するかは、アプリケーションによって異なります。
モジュールがログレベルの分類関数を提供する可能性がある呼び出し側で同様のパターンを使用しています (無効な結果を返す可能性があります)。私はこのようにします:
-spec categorize(atom(), integer()) -> log_classification().
categorize(Module, Code) ->
case catch(Module:ns_log_cat(Code)) of
info -> info;
warn -> warn;
crit -> crit;
_ -> info % Anything unknown is info (this includes {'EXIT', Reason})
end.
メソッドがないため (一般に、オブジェクト指向の動作を作成し、それをメッセージで実装してmethod_missing
から .