16

アンダースコア変数と、Erlangコンパイラーの観点からアンダースコアで始まる名前付き変数の正確な違いは何ですか(コードに読みやすさを追加することは別として)?

たとえば__Var違いますか?

4

2 に答える 2

25

ドントケア変数_は、何にでも一致する非常に特殊な変数であり、値にバインドされることはありません。そこに何かがあることを知っているときに使用されますが、値が何であるかは気にせず、決して使用しません。シーイング_はバインドされることはなく、式で使用することはできず、コンパイラーはエラーとしてフラグを立てます。

のような変数_Varは完全に通常の変数であり、照合でき、値にバインドされます。つまり、式で使用できます。変数の前に付けることは、意図_についてです。コンパイラは通常、パターンにバインドされているが使用されない変数について警告します。多くの場合、エラーの兆候です。ただし、コンパイラは、のように接頭辞が付いた変数については警告しません。変数に名前を付けたいという意図で、名前を付けるのは良いことですが、決して使用しないことはわかっています。__Var

_これが実際に唯一の特殊変数であり、_Var通常の変数であり、使用するとそのように動作することを忘れないでください。ひねくれていると感じている場合は、すべての変数の前に接頭辞を付けることができますが、_それでもすべてが機能します。

于 2012-12-05T12:10:50.747 に答える
20

ここでドキュメントを引用しましょう:

匿名変数はアンダースコア(_)で示され、変数が必要な場合に使用できますが、その値は無視できます。[...]

_たとえば、アンダースコア()で始まる_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に等しくないため、ここで条件は失敗します。

于 2012-12-04T16:31:12.647 に答える