Reputation: 4650
I need to pass a module attribute as a function parameter, however it doesn't work for me and it raises an error. Here is my code:
defmodule Waiter do
@defaultInterval 1
@defaultTimeout 10
def wait(condition, timeout, interval) do
IO.puts "condition #{condition} timeout #{timeout} interval #{interval}"
end
def wait(condition, timeout), do: wait(condition, timeout, Waiter.defaultInterval)
def wait(condition), do: wait(condition, Waiter.defaultTimeout, Waiter.defaultInterval)
end
Waiter.wait("condition", 2, 20)
Waiter.wait("condition", 2)
Waiter.wait("condition")
I'm getting a warning about @defaultInterval
and @defaultTimeout
declared but not being used, and then an error:
iex(4)> Waiter.wait("condition", 2)
** (UndefinedFunctionError) function Waiter.defaultInterval/0 is undefined or private
Waiter.defaultInterval()
iex:7: Waiter.wait/2
If I will pass just a value (e.g. Waiter.wait("condition", 1, 10)
), that will work.
How can I refactor my code so it would work properly?
Upvotes: 0
Views: 617
Reputation: 222118
Module attributes are accessed the same way they're declared: with the @
before the name:
def wait(condition, timeout), do: wait(condition, timeout, Waiter.defaultInterval)
def wait(condition), do: wait(condition, Waiter.defaultTimeout, Waiter.defaultInterval)
should be
def wait(condition, timeout), do: wait(condition, timeout, @defaultInterval)
def wait(condition), do: wait(condition, @defaultTimeout, @defaultInterval)
Sidenote: In Elixir these names are conventionally written in snake_case
, e.g. @default_timeout
.
Upvotes: 4