Ignoring the return value

1 min read elixir

Two weeks ago José Valim created a Pull Request in the Phoenix project. One of the things that stood out to me when I was taking a look at it was this line.

Here, José is pattern matching to underscore the result value of the call to Process.monitor/1, which at first looks like an unnecessary match, due to the fact that the result will be ignored.

The full function block looks something like this:

def init({socket, auth_payload, parent, ref}) do
  _ = Process.monitor(socket.transport_pid)
  %{channel: channel, topic: topic} = socket
  socket = %{socket | channel_pid: self()}

  case channel.join(topic, auth_payload, socket) do
    {:ok, socket} ->
      init(socket, %{}, parent, ref)
    {:ok, reply, socket} ->
      init(socket, reply, parent, ref)
    {:error, reply} ->
      send(parent, {ref, reply})
      :ignore
    other ->
      raise """
      channel #{inspect socket.channel}.join/3 is expected to return one of:
          {:ok, Socket.t} |
          {:ok, reply :: map, Socket.t} |
          {:error, reply :: map}
      got #{inspect other}
      """
  end
end

As he explains:

Yes, we usually do it to say “i know this returns something meaningful, but i am sure i don’t need it”.

This seems to be a good convention to show we won’t use the returned expression, so I will take it into account to use it in the future.