Elixir模块调用:erlang.trace_pattern/2的正确MFA语法是什么?
正确调用
:erlang.trace_pattern/2追踪Elixir String.contains?/2的写法 你的问题核心在于MFA格式中函数名的类型错误:Erlang的trace_pattern/2要求MFA(Module-Function-Arity)里的函数名必须是原子(atom),而非字符串或字符列表。
正确调用方式
直接使用原子形式的函数名,模块名可以用Elixir原生的String(会自动转换为Erlang原子:"Elixir.String"):
:erlang.trace_pattern({String, :'contains?', 2}, [])
或者显式写出Erlang风格的模块原子:
:erlang.trace_pattern({:"Elixir.String", :'contains?', 2}, [])
为什么之前的写法失败
- 第一次尝试用了字符串
"contains?":Erlang不接受字符串作为MFA中的函数名参数,必须是原子类型,因此触发无效MFA规范的错误。 - 第二次尝试用了
:string模块:Elixir的String模块在Erlang虚拟机中对应的原子是:"Elixir.String",小写的:string是Erlang内置的独立模块,和Elixir的String完全无关,所以同样报错。
验证方式(可选)
在iex中可以直接确认模块和函数的原子形式:
iex> # 查看Elixir模块对应的Erlang原子 iex> Atom.to_string(String) "Elixir.String" iex> # 确认函数名是原子类型 iex> is_atom(:'contains?') true
内容的提问来源于stack exchange,提问作者Onorio Catenacci
相关产品推荐
相关产品推荐

