2017-07-18 3 views
1

たとえば、Integer.parse/2関数のデフォルト値は10で、String.to_integer/1String.to_integer/2の両方が存在します。baseを指定する必要がある場合は、2番目の値が使用されます。なぜいくつかのElixirライブラリ関数は複数のアリティを使用するのに対し、他のものはデフォルト値を使用するのはなぜですか?

このように実装された理由はありますか? 関数を定義するときは、どちらを使うべきですか?

私の仮定した答えは、異なる値の実装については実際の違いがありますが、デフォルト値のバージョンは同じ実装を共有しています。しかし、私はなぜこの場合異なる実装があるのか​​、具体的には分かりません。

答えて

2

ほとんどの場合、カバーの下に同じことがあります。 Elixirでデフォルトの引数を指定すると、2つの関数が作成されます。 argの値がデフォルトに設定されていない方が少なく、 argを追加するargが1つあります。 Integerモジュールをイントロスペクトすることでわかるように、 は解析/ 1と解析/ 2をエクスポートします。 String.to_integer著者の場合は

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 ] 

より明示的なことと、これを実装する基本的なErlangの機能の折り返しを反映することにしました。

+0

ワウ。第一に、デフォルトの議論の側面を見ることは冷静ですが、第二に、Erlangにそって整列させるのがより理にかなっています。 – Camsbury

2

Functions accepting default arguments are transformed into multiple functions with corresponding arities

私の見解では、デフォルトの引数を受け入れるために複数の機能ヘッドを使って書かれた関数は、//スタイルのデフォルトパラメータよりも理解しやすいガード句を書くことができるので、この方法はそのままです。

さらに、Erlang(多数のElixirコードが参照されている)では、複数の頭で定義された関数が直接的な変換であるため、//を除いたコードが不均等に保存されます。

関連する問題