serge1peshcoff
serge1peshcoff

Reputation: 4650

Passing a variable as a parameter in Elixir

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

Answers (1)

Dogbert
Dogbert

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

Related Questions