您可以使用別名來確定地寫出短而緊湊的代碼。只要確保你不會迷惑自己。檢查offical documentation
iex(1)> alias Enum, as: E
nil
iex(2)> E.reduce [1,2,3,4], &(&1+&2)
10
至於你的問題的第一部分。當您導入模塊,衝突會顯示曖昧error.For例如
iex(1)> import Map, only: [delete: 2]
iex(5)> delete %{a: 4,b: 5}, :a
iex(6)> import List, only: [delete: 2]
iex(8)> delete %{a: 4,b: 5}, :a
** (CompileError) iex:8: function delete/2 imported from both List and Map, call is ambiguous
(elixir) src/elixir_dispatch.erl:111: :elixir_dispatch.expand_import/6
(elixir) src/elixir_dispatch.erl:82: :elixir_dispatch.dispatch_import/5
所以確保你從一個module.using的only
關鍵字僅導入有用的功能。另一個好的選擇是利用import中的詞彙範圍。您可以在哪裏指定要使用導入的位置,並且只有該部分會生效。下面是一個例子
defmodule Math do
def some_function do
import List, only: [duplicate: 2]
duplicate(:ok, 10)
end
def other_function do
duplicate(:ok, 10)#this will show error since import is only present inside some_function
end
end
或者protocol可能是你正在尋找for.The文檔會告訴你,你需要知道的事情,i'l提出了一個簡短的總結在這裏。
defprotocol Get do
@doc "Returns the data,for given key"
def get(data,key)
end
然後就可以實現它爲任何類型你需要
defimpl Get, for: Map do
def get(data,key), do: Map.get(data,key)
end
defimpl Get, for: Keyword do
def get(data,key), do: Keyword.get(data,key)
end
defimpl Blank, for: Any do
def blank?(data,key), do: raise(ArgumentError, message: "Give proper type for key")
end
你想要的是類型推斷。即使在支持這種語言的語言(主要是ML族語言)中,類型註釋有時也是必需的。我的意思是說,即使是在類型推斷的語言中,你可能不得不做類似於Dict.get或String.get的事情。而且,雖然較短的代碼是一個很好的目標,但其他開發人員能夠閱讀代碼也是一個重要目標。從這個角度來看,強制消歧並不完全是一件壞事。 –