アンダースコア変数と、Erlangコンパイラーの観点からアンダースコアで始まる名前付き変数の正確な違いは何ですか(コードに読みやすさを追加することは別として)?
たとえば_
、_Var
違いますか?
ドントケア変数_
は、何にでも一致する非常に特殊な変数であり、値にバインドされることはありません。そこに何かがあることを知っているときに使用されますが、値が何であるかは気にせず、決して使用しません。シーイング_
はバインドされることはなく、式で使用することはできず、コンパイラーはエラーとしてフラグを立てます。
のような変数_Var
は完全に通常の変数であり、照合でき、値にバインドされます。つまり、式で使用できます。変数の前に付けることは、意図_
についてです。コンパイラは通常、パターンにバインドされているが使用されない変数について警告します。多くの場合、エラーの兆候です。ただし、コンパイラは、のように接頭辞が付いた変数については警告しません。変数に名前を付けたいという意図で、名前を付けるのは良いことですが、決して使用しないことはわかっています。_
_Var
_
これが実際に唯一の特殊変数であり、_Var
通常の変数であり、使用するとそのように動作することを忘れないでください。ひねくれていると感じている場合は、すべての変数の前に接頭辞を付けることができますが、_
それでもすべてが機能します。
ここでドキュメントを引用しましょう:
匿名変数はアンダースコア(
_
)で示され、変数が必要な場合に使用できますが、その値は無視できます。[...]
_
たとえば、アンダースコア()で始まる_Height
変数は、匿名ではなく通常の変数です。ただし、未使用の変数に対して警告を生成しないという意味で、コンパイラによって無視されます。
つまり、_Var
一致した式を一致させる必要がある場合にフォームを使用しますが、それ以上使用したくない場合や、その意味を示したい場合に使用します。_
また、変数と一致する式を自分もコンパイラも気にしない場合は、変数を使用します。
例1:
member(_, []) -> [].
この関数では、最初に何が_
一致するかが明確ではありません。しかし、次のように直接書き直してください。
member(Elem, []) -> [].
warn_unused_vars
...コードがフラグを設定してコンパイルされている場合、警告が生成されます。ただし、下線付きの変数を使用することで、ここでコードを読みやすくすることができます。
member(_Elem, []) -> [].
例2:
{_, _, Some} = {1, 2, 3}
タプルの最初の2つの要素は完全に無視されるため、このタプルの一致はまったく問題ありません。
{_Var, _Var, Some} = {1, 2, 3}
ただし、このマッチングは失敗_Var
します。使用する必要はありませんが、同じ値で「埋める」必要があります。1は2に等しくないため、ここで条件は失敗します。