簡體   English   中英

在Elixir中打印變量名稱

[英]Print a variable name in Elixir

警告:這是一個聰明的嘗試。 我知道我可能只是讓它可讀,但這並不意味着我不想知道如何聰明:-P

我有這樣的事情(人為的例子):

def glue(%{"alpha" => alpha, "beta" => beta}) do
  cond do
    alpha && beta ->
      alpha <> beta
    alpha ->
      IO.puts("oops, you forgot to give me alpha!")
    true ->
      IO.puts("oops, you forgot to give me beta!")
  end
end

但我想改為:

def glue(%{"alpha" => alpha, "beta" => beta}) do
  cond do
    alpha && beta ->
      alpha <> beta
    true ->
      something
      |> need_field()
  end
end

defp need_field(something) do
  IO.puts("oops, you forgot to give me " <> something)
end

有一個聰明的方法來獲取空變量的名稱?

我正在思考使用alpha || beta的某種方式 alpha || beta獲取填充的,然后打印另一個的名稱,但我似乎無法到達那里。

你必須小心匹配地圖鍵。 如果地圖不包含密鑰,那么您的功能頭將不匹配。 你可以這樣做:

def glue(%{"alpha" => alpha, "beta" => beta} = map) do
  cond do
    alpha && beta ->
      alpha <> beta
    true ->
      need_field(map)
  end
end

defp need_field(map) do
  Enum.each(map, fn 
    {k, nil} -> IO.puts "You forgot to give me #{k}"
    _ -> nil
  end
end

現在,如果您希望地圖缺少該字段,那么您可以添加第二個函數子句:

def glue(map) do
  Enum.each ~w(alpha beta), fn key -> 
    if map[key], do: nil, else: IO.puts("You forgot to give me #{key}")
  end
end

如果是地圖,這是完整的解決方案。

def glue(%{"alpha" => alpha, "beta" => beta} = map) do
  cond do
    alpha && beta ->
      alpha <> beta
    true ->
      need_field(map)
  end
end
def glue(map) do
  Enum.each ~w(alpha beta), fn key -> 
    if map[key], do: nil, else: IO.puts("You forgot to give me #{key}")
  end
end

defp need_field(map) do
  Enum.each(map, fn 
    {k, nil} -> IO.puts "You forgot to give me #{k}"
    _ -> nil
  end
end

如果輸入是結構,那么您不必擔心default子句,因為struct必須包含所有鍵。 在這種情況下,您可以從結構中獲取密鑰

map
|> Map.from_struct 
|> Enum.each(...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM