rogerweb

rogerweb

I have a module with a function with two implementations using pattern matching:

def agent_registered(%Event{} = event) do
  ...
end

def agent_registered(agent_id) do
  ...
end

My application’s main module contains only defdelegates to a number of “implementation” modules.

Someone trying to call a function from the main module can use the auto-complete feature of iex or the IDE to see the arguments it expects, which is nice. However, in the case of that agent_registered function I can’t include two defdelegates, one for each case, as it’s the same function:

This is “wrong” (a warning is displayed for the second line):

  defdelegate agent_registered(event), to: AgentRegistered
  defdelegate agent_registered(user_id), to: AgentRegistered

This is fine, but then the argument name must cater for all the possibilities:

  defdelegate agent_registered(event_or_user_id), to: AgentRegistered

I tried adding @spec to the actual function implementation informing the possible argument types but iex and IDE keeps showing the argument name as in the defdelegate.

Have you ever had to deal with such scenario? Should I simply have different functions for different arguments instead of pattern matching in this case? Should I go for def instead of defdelegate and bring the pattern matching to the main module?

Thanks!

Showing Posts 1 to 1

baldwindavid

baldwindavid

I think it’s fine to delegate to a function with multiple heads and to just use an argument name that is clear. The name event_or_user_id is pretty obvious. As an aside, I wonder if you might consider whether it is more explicit at the callsite to have separate function names like agent_registered and agent_registered_by_id. Sometimes it’s nice having a function that can handle either a struct or an ID. Other times it can lead to a lack of clarity of what you’re dealing with and a whole bunch of functions needing to handle both data types rather than just always sticking with one or the other.

— All posts loaded —

Where Next? Top

Trending in Questions Top

katta
I having some trouble figuring out if I have set myself too strict of standards for my production server. Currently I can handle 75% of r...
New
achenet
Hello, I’m trying to build a basic Phoenix web-app, and I’d like to use Tailwind. However, when I launch mix phx.server, I get an error...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
Cxx-mlr
I’m working on a small exercise involving update_in/3, and I came up with this solution: data = %{ name: "Periodic Table", category:...
New
ChrisAmelia
I’ve got trouble wrapping my head around the order in which functions are called in this snippet (from Phoenix’s authentication): toke...
New
dillonoconnor
Is there any way to avoid the Hologram compiler running when using iex? It seems like the front-end code could potentially be disregarded...
New
thiagogsr
** (ArgumentError) expected :max_attempts to be a positive integer, got: {:@, [line: 10, column: 19], [{:max_attempts, [line: 10, column:...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
budgie
A little off-topic, but I feel like people here have a good head on their shoulders. I used to be quite good at making software. Was luc...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
New
mcass19
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews