Erlang和方法_缺失

Erlang和方法_缺失,erlang,method-missing,Erlang,Method Missing,我有Java和Ruby的背景,我想知道Erlang中是否有“method_missing”的等价物。我已经看过了文档,我能看到的最接近的是erl_eval和erl_parse的使用,但我想知道是否还有其他方法?我在调用端使用了类似的模式,模块可能会提供日志级别的分类函数(可能会返回无效结果)。我是这样做的: -spec categorize(atom(), integer()) -> log_classification(). categorize(Module, Code) ->

我有Java和Ruby的背景,我想知道Erlang中是否有“method_missing”的等价物。我已经看过了文档,我能看到的最接近的是erl_eval和erl_parse的使用,但我想知道是否还有其他方法?

我在调用端使用了类似的模式,模块可能会提供日志级别的分类函数(可能会返回无效结果)。我是这样做的:

-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.

由于没有方法(一般来说,您当然可以创建一个OO行为并用消息实现它,然后让
方法\u丢失
,被调用方不知道我尝试了什么,因此无法解释它。

当您尝试调用未定义的函数时,会调用“error\u handler”模块

process_flag(error_handler, Module).
模块需要导出
undefined_function/3
undefined_lambda/3
。您可以在标准处理程序模块
error_handler
中看到这应该如何实现


您需要在自己的
错误处理程序中小心,不要破坏标准代码加载系统。Erlang通常会尝试从未定义的函数错误加载模块,并在放弃并发出错误信号之前重新运行该函数。您通常希望先尝试标准错误处理程序,如果at失败。

如果您正在进行“防御性编码”,您可以调用
模块:模块信息(导出)
,查看您要调用的函数是否导出。

Erlang具有函数而不是方法,通常尝试调用未定义的函数被视为错误


如果您尝试调用同一模块中不存在的函数,编译器将生成错误。尝试调用另一模块中的函数将在运行时生成错误,
unde
错误。您希望如何处理此类错误取决于您的应用程序。

Archelus指出了一个好的方向,但如果您不希望使用
error\u处理程序
,它确实支持一个很好的回调例程,通知被调用的模块有人试图调用未定义的函数,这似乎非常方便

因此,如果您将其添加到模块中:

'$handle_undefined_function'(Func, Args) ->
     io:format("Called undefined function '~p' with args ~p.~n", [Func, Args]).

每当调用该模块中未定义的函数时,它都会打印一条消息。

这与case语句中的默认子句相同吗?在这种情况下,我匹配三个已知的正确值,然后处理任何其他情况(包括异常和退出)默认情况下。我使用
\uuuuuuu
,因为我不关心结果。有用的提示,我尝试了这个方法,它确实提供了有用的信息。那么,有没有什么方法可以动态地将一个方法添加到此列表(我指的是模块)中,因为这可能是有用的呢?请检查一下smerl:这看起来很有希望。这是否意味着“函数”丢失了可以为运行时调用的外部模块创建方法吗?是的,可以。有关更多详细信息,请参阅前面的@archelus answer。但请注意,如果错误处理程序不是100%正确,则弄乱错误处理程序可能会完全破坏自动代码加载,并真正弄乱系统。可能在最初提出问题时,这并不存在问,但这肯定是正确的答案。如果可以的话+10。