2016-08-10 12 views
1

同じバリューを変数に複数回割り当てると、エラーが発生することはありませんが、割り当てられたようなものです再び?ここでErlangで同じ値を2回割り当てる

は一例です:

X = 1, 
X = 100 - 99, 
X = 1, 
X = list_to_integer("1"), 
X = X. 

は、それがエラーを投げるべきではないでしょうか。エラーを投げることは、コードの一部が変数を再割り当てしようとしていることを意味する可能性があり、以前と同じように運がよいことがあります。

答えて

4

実際には割り当てではなく、一致操作(等号は実際には一致演算子です)です。 http://erlang.org/doc/reference_manual/patterns.html

実際には、オペレータ(=)の左側にあるものと右側にあるものとのパターンマッチングを試みています。

左側に変数があり、まだ境界が設定されていない場合は、右側にある値にバインドされます。

一方、変数が既にバインドされていて、値が演算子の右側にあるものと同じ場合、何も起こりません。マッチングは成功します。

値が異なる場合、パターンマッチングエラーが発生します。

特殊変数 "_"は、任意の値にパターンマッチングすると常に成功します。

Erlangでのパターンマッチングは、何か問題が発生したときにすばやく失敗するため、本当に役立ちます。このコードではたとえば:

{ok, Value} = some_function() 

some_function/0であれば返すようなもの{エラー、_}あなたのコードだけでクラッシュすると、あなたは無効な値で実行を継続するリスクはありません。

some_functionが期待値を返した場合、変数Valueはその結果に限定されます。これは、1行のコードに代入とアサーションを持つようなものです(そのように見たい場合)。

意味がありますか?

+0

はい、感謝します。私が他の言語で見たことがあるように、Erlangには従来の変数割り当てメカニズムがないようです。 –

+2

素晴らしい!パターンマッチングでは、Erlangでは多くの用途があります。これは、あなたが具体的に1つのユースケースについて尋ねたためですが、function節、try-catch、caseなどでパターンマッチングを使用できるためです。パターンマッチングを使用すると、より明瞭で、コード内のifとspotバグを避けるための素晴らしい方法です。あなたはこの素晴らしい本でもっと読むことができますhttp://learnyousomeerlang.com/syntax-in-functions乾杯! – marcelog

関連する問題