[英]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.