I have this:
defmodule MyTest1 do
def print_data do
IO.puts("***this module: #{__MODULE__}")
end
end
If I call it from within other module, it’ll still print the name of the original module --> Elixir.MyTest1
.
How to change it such that it’ll print the name of a module it’s being called from? Without having to pass __MODULE__
to the function call.
bobics
November 17, 2019, 5:41am
2
One way would be to use a macro. But I think it’s generally recommended to only use macros if you really need them or if it really reduces boilerplate.
You can use __CALLER__
…
https://hexdocs.pm/elixir/Kernel.SpecialForms.html# CALLER /0
defmacro print_data do
quote do
IO.puts("***this module: #{unquote(__CALLER__.module)}")
end
end
(edit: added __CALLER__
info)
3 Likes
lud
November 18, 2019, 2:05pm
6
__MODULE__
is evaluated at compile time, that is why it will always show the module it is called in.
1 Like