Я играю с попыткой вызвать :erlang.trace_pattern/2. Как я часто делаю с такими вещами, я решил начать с чего-то простого, а затем добавить больше сложности по мере того, как я лучше знакомлюсь. Однако в этом случае я не могу понять простую часть правильно.
Я пытаюсь передать String.contains?/2 Эликсира в :erlang.trace_pattern/2. Я пробовал этот вызов:
:erlang.trace_pattern({:"Elixir.String","contains?",2},[])
Что возвращает:
** (ArgumentError) errors were found at the given arguments:
* 1st argument: invalid MFA specification
:erlang.trace_pattern({String, "contains?", 2}, [])
Одна вещь, которая показалась мне странной, заключалась в том, что предисловие к Эликсиру в названии модуля исчезло. Я также пробовал это:
:erlang.trace_pattern({:string, 'contains?', 2}, [])
Что возвращает:
** (ArgumentError) errors were found at the given arguments:
* 1st argument: invalid MFA specification
:erlang.trace_pattern({String, 'contains?', 2}, [])
Я пробовал несколько комбинаций, и я не могу понять, что мне нужно сделать, чтобы это сработало. Документы Erlang говорят, что тип первого аргумента — {Module, Function, Arity}
, и я уверен, что правильно понял по крайней мере часть арности, но два других, кажется, ускользают от меня. Каков правильный синтаксис для этого вызова?
Если это имеет значение, я пробую это в 1.14.0 на MacOS в iex.
Второй аргумент должен быть атомом:
:erlang.trace_pattern({String, :contains?, 2}, true)
Вы увидите это, если когда-нибудь воспользуетесь функцией apply/3
, например.
iex> apply(String, :upcase, ["hello"])
"HELLO"
Кроме того, будьте осторожны с одинарными кавычками в Эликсире: это сокращение от «списков символов», что означает, что 'thing'
и "thing"
представляют разные вещи.
К вашему сведению: имена модулей Elixir, например. String
автоматически начинаются где-то с префиксом Elixir.
, поэтому String == :"Elixir.String"
Глядя на это сейчас, я вижу, что спецификация MFA ясно говорит
atom()
для второго параметра. Не знаю, как я это пропустил.