Hiding and Revealing Struct Info with `inspect`
There are two ways to hide information when printing structs in Elixir.
Hiding by implementing the inspect protol.
defmodule Thing do
defstruct color: "blue", tentacles: 7
end
defimpl Inspect, for: Thing do
def inspect(thing, opts) do
"A #{thing.color} thing!"
end
end
So now in iex I can't tell how many tentacles the thing has:
> monster = %Thing{color: "green", tentacles: 17}
> IO.inspect(monster, label: "MONSTER")
MONSTER: A green thing!
A green thing!
Note that iex uses inspect
to output data which can get confusing.
NEW IN ELIXIR 1.8: You can also hide data with @derive
defmodule Thing do
@derive {Inspect, only: [:color]}
defstruct color: "blue", tentacles: 7
end
And now you won't see tentacles on inspection
> monster = %Thing{color: "green", tentacles: 17}
> IO.inspect(monster)
#Thing<color: "green", ...>
In both cases, you can reveal the hidden information with the structs: false
option:
> monster = %Thing{color: "green", tentacles: 17}
> IO.inspect(monster)
#Thing<color: "green", ...>
> IO.inspect(monster, structs: false)
%{__struct__: Thing, color: "green", tentacles: 17}
Tweet