José Valim最近宣布Elixir 1.3中棄用了必要賦值,添加了一些新的類(lèi)型和存取器,提升了其Mix搭建工具和ExUnit單元測(cè)試框架。
Elixir 1.3棄用了對(duì)需要在外部作用域進(jìn)行訪問(wèn)的變量的賦值,如果發(fā)現(xiàn)有這樣的情況就會(huì)立刻發(fā)出警告。這個(gè)操作的根據(jù)是給在外部作用域中的變量進(jìn)行賦值,從而給內(nèi)部作用域中的值添加隱式返回值。例如下面的函數(shù)定義:
def format(message, opts) do path = if (file = opts[:file]) && (line = opts[:line]) do relative = Path.relative_to_cwd(file) message = Exception.format_file_line(relative, line) <> " " <> message relative end {path, message}endif塊語(yǔ)句,除了返回path的值還改變了message中的值,這個(gè)值后面從封閉的函數(shù)中由path返回。在 Elixir 1.3中這被認(rèn)為是錯(cuò)誤的操作,需要重構(gòu)成如下的代碼,很明確地定義if塊返回兩個(gè)值后方可使用:
def format(message, opts) do path = if (file = opts[:file]) && (line = opts[:line]) do relative = Path.relative_to_cwd(file) message = Exception.format_file_line(relative, line) <> " " <> message {relative, message} end {path, message}end另外一個(gè)可以方便地遍歷嵌套的數(shù)據(jù)結(jié)構(gòu)的語(yǔ)言功能是存取選擇器。以下的代碼中向你展示了如何遍歷一個(gè)與language值相關(guān)聯(lián)的map,并將name值中所有的元素都轉(zhuǎn)換為大寫(xiě):
iex> update_in myMap, [:languages, Access.all(), :name], &String.upcase/1Elixir的搭建工具M(jìn)ix現(xiàn)在可以進(jìn)行對(duì)照檢查,這個(gè)功能非常實(shí)用,比如說(shuō)在檢測(cè)對(duì)不存在的模塊和函數(shù)的調(diào)用時(shí),或是定位所有調(diào)用了屬于某個(gè)模塊的函數(shù)時(shí),或是產(chǎn)生依賴(lài)關(guān)系圖的時(shí)候。另外,Mix簡(jiǎn)化了其輸出,因此可以更方便地發(fā)現(xiàn)警告。Elixir 1.3中Mix的另一大改進(jìn)是可以更好地進(jìn)行依賴(lài)跟蹤,因此編譯時(shí)間會(huì)進(jìn)一步縮短。
Elixir的單元測(cè)試框架ExUnit利用Mix的對(duì)照檢查功能添加了一個(gè)新標(biāo)志--stale,它可以保證從上次運(yùn)行之后,只有修改過(guò)的單元測(cè)試才會(huì)被執(zhí)行。ExUnit還優(yōu)化了斷言輸出并提升了對(duì)于使用命名塊的測(cè)試。
Elixir 1.3還進(jìn)行了更多改變。你可以閱讀發(fā)行說(shuō)明中的完整列表。
查看英文原文:Elixir 1.3 Brings New Language Features, APIs, and Improved Tooling