2017-05-03 79 views
3

警告:這是一個聰明的嘗試。我知道,我也許應該只是離開它的可讀性,但這並不意味着我不想知道如何聰明:-P在Elixir中輸入一個變量名

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

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來填充填充的那個,然後打印另一個的名字,但是我似乎無法完成。

+0

您將需要使用宏來實現這樣的功能。 –

+0

如果alpha && beta'返回false,你期望alpha或beta是什麼?他們會是零,還是他們會是假的? –

+0

假設是他們可能是零,不能是假的。 – TrivialCase

回答

3

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

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 

如果輸入的是一個結構,那麼你不必擔心違約條款,因爲一個結構必須有所有的按鍵。在這種情況下,您可以從結構中獲取密鑰

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

好的答案!我喜歡它推廣到的情況下,即將到來的地圖具有任意多個鍵。謝謝! – TrivialCase