作爲示例,Integer.parse/2
函數對於基數具有默認值10,而String.to_integer/1
和String.to_integer/2
都存在,其中第二個用於需要指定base
時。爲什麼一些Elixir庫函數使用多個arities,而另一些則使用默認值?
有什麼理由以這種方式實施? 什麼時候應該使用其中一個來定義函數?
我假設的答案是不同的arities在實現上有一些實際的差異,而默認值版本共享相同的實現。但是,我不知道爲什麼在這種情況下會有不同的實現,具體來說。
作爲示例,Integer.parse/2
函數對於基數具有默認值10,而String.to_integer/1
和String.to_integer/2
都存在,其中第二個用於需要指定base
時。爲什麼一些Elixir庫函數使用多個arities,而另一些則使用默認值?
有什麼理由以這種方式實施? 什麼時候應該使用其中一個來定義函數?
我假設的答案是不同的arities在實現上有一些實際的差異,而默認值版本共享相同的實現。但是,我不知道爲什麼在這種情況下會有不同的實現,具體來說。
在封面下大多是一樣的東西。在Elixir中指定默認參數時,會發生兩個函數被創建的情況。其中一個原因是arg設置爲默認值,另一個採用 其他arg。正如您通過內省整數模塊所看到的,它會導出parse/1和parse/2。 導出parse/1和parse/2。
iex(2)> Integer.module_info(:exports)
[__info__: 1, digits: 1, digits: 2, floor_div: 2, "MACRO-is_even": 2,
"MACRO-is_odd": 2, mod: 2, parse: 1, parse: 2, to_char_list: 1, to_charlist: 1,
to_charlist: 2, to_string: 1, to_string: 2, undigits: 1, undigits: 2,
module_info: 0, module_info: 1 ]
在String.to_integer
作者的情況下決定更加露骨和反映實現這一基本功能二郎包裝。
在我看來,這種做法依然存在,因爲使用多個函數頭編寫的函數容納默認參數允許編寫比//
樣式的默認參數更易理解的保護子句。另外,因爲用Erlang定義的多個頭部定義的函數(大量的Elixir代碼是參照它編寫的),所以直接翻譯保留了不成比例的代碼量,而沒有//
。
哇。首先,看到默認參數的方面很酷,但其次,更有意義的是,他們會這樣做,以便與Erlang一致。 – Camsbury