2011-02-19 4 views
2

パフォーマンス(または他の)観点からのこれらの2つの違いはありますか?アーラン引数の一致とパフォーマンス

f1(X =任意) - > ok; (もっと...)

F2(どんな= X) - > OK。 (続き...)

+0

なぜパターンマッチング式として割り当てを使用していますか?それは非常に混乱しています。あなたは "f1()X =何でも"を意味しませんでしたか? –

+0

Erlangでの割り当ては、バインドされていない変数とのパターンマッチングの効果です。少なくとも混乱はありません。 – andreypopp

+1

私が引数で代入を使用するのは、割り当てられた変数を後でコードで使用できるようにするためです。上記のコードはこれを示すのはあまりにも簡単ですが、複雑なリストやタプルを使っていたら、複雑な構造を入力する代わりに、後で割り当てられた変数を使うことができます。私の前提は、エンジンは複雑な構造にパターンマッチすることであり、変数(これは私が欲しいものです)ではありません。私の質問は、これが真であるかどうか、すなわち上記のものが常に「何でも」(私が望むもの)の原子と一致するかどうか、あるいはXと時には一致するかどうかです。 – hello

答えて

4

コンパイラが生成するコードを調べるには、-Sでコンパイルして.Sファイルを生成します。このようなものが得られ、コンパイラがあなたの2つのケースごとにまったく同じコードを生成することを確認できます。

{function, f1, 1, 12}. 
{label,11}. 
{func_info,{atom,test},{atom,f1},1}. 
{label,12}. 
{test,is_eq_exact,{f,11},[{x,0},{atom,whatever}]}. 
return. 

私は「whatever = X」が個人的には直感的ではなく、読みにくいと判断します。

+2

私もそうですが、興味深いことに、このスタイルをコードに使用している開発者がいくつか見受けられました。どこでX =何を使っているのかがわかりました。 – hello

+0

私は 'whatever = X'を好む。私には '='は身体のように振る舞います:RHSは変数/値であり、LHSはそれが一致するパターンです。 @cthulahoopsは言うように、生成されるコードには何の違いもありません.LHSとRHSは*エイリアス*です。 – rvirding

1

=は、LHSおよびRHSがの別名であることを意味します。両者は値に一致する必要がありますので、何かを書くこと{X}=[Y]は決して一致しません(そしてコンパイラは文句を言うでしょう)。これは、{X,Y}=Tのようによく使われ、データを一致させたり引き離したりすることができます。はまだ構造全体を参照しています。どちらもあなたのケーキを食べて食べる。 のように使うことができるので、トップレベルだけでなくパターン内のどこでも使用できます。

パフォーマンスの違いはありません。

関連する問題