将变量作为参数传递给Elixir

时间:2018-03-11 07:24:05

标签: elixir

我需要将模块属性作为函数参数传递,但它不适用于我并且它会引发错误。这是我的代码:

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")

我收到有关@defaultInterval@defaultTimeout已声明但未被使用的警告,然后出现错误:

iex(4)> Waiter.wait("condition", 2)
** (UndefinedFunctionError) function Waiter.defaultInterval/0 is undefined or private
    Waiter.defaultInterval()
    iex:7: Waiter.wait/2

如果我只传递一个值(例如Waiter.wait("condition", 1, 10)),那就可以了。

如何重构代码以使其正常工作?

1 个答案:

答案 0 :(得分:4)

模块属性的访问方式与它们声明的方式相同:名称前面有@

def wait(condition, timeout), do: wait(condition, timeout, Waiter.defaultInterval)
def wait(condition), do: wait(condition, Waiter.defaultTimeout, Waiter.defaultInterval)

应该是

def wait(condition, timeout), do: wait(condition, timeout, @defaultInterval)
def wait(condition), do: wait(condition, @defaultTimeout, @defaultInterval)

旁注:在Elixir中,这些名称通常用snake_case写成,例如@default_timeout