我需要将模块属性作为函数参数传递,但它不适用于我并且它会引发错误。这是我的代码:
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)
),那就可以了。
如何重构代码以使其正常工作?
答案 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
。