如何使用默认和可选参数?

时间:2016-04-05 17:22:14

标签: elixir

我有这个功能

    def start(data, opts \\ [pages: 17, depth: 3]) do
        maxPages = opts[:pages]
        maxDepth = opts[:depth]
        IO.puts maxPages
        IO.puts maxDepth
    end

当我执行Program.start("data", pages: 8)时,我希望它能够打印83,但它只打印8

2 个答案:

答案 0 :(得分:15)

您可以改为使用Keyword#get/3,例如:

def start(data, opts \\ []) do
    maxPages = Keyword.get(opts, :pages, 17)
    maxDepth = Keyword.get(opts, :depth, 3)
    IO.puts maxPages
    IO.puts maxDepth
end

或者,Keyword#merge/2opts中传递并带有一些默认值:

def start(data, opts \\ []) do
    finalOpts = Keyword.merge([pages: 17, depth: 3], opts)
    maxPages = finalOpts[:pages]
    maxDepth = finalOpts[:depth]
    IO.puts maxPages
    IO.puts maxDepth
end

希望它有所帮助!

答案 1 :(得分:0)

使用地图代替关键字列表在我看来更紧凑/更好:

defmodule U2 do
  def format(value, opts \\ %{}) do
    opts = %{unit: "kg", decimals: 2} |> Map.merge(opts)
    "#{Float.to_string(value, [decimals: opts.decimals])} #{opts.unit}"
  end
end
IO.inspect U2.format 3.1415                            # "3.14 kg"
IO.inspect U2.format 3.1415, %{decimals: 3}            # "3.142 kg"
IO.inspect U2.format 3.1415, %{decimals: 3, unit: "m"} # "3.142 m"
IO.inspect U2.format 3.1415, %{unit: "Pa"}             # "3.14 Pa"