Сопоставление аргументов Erlang и производительность

Есть ли разница между этими двумя с точки зрения производительности (или любой другой)?

f1(X=что угодно) -> хорошо; (более...)

а также

f2(что угодно=X) -> хорошо; (более...)


person hello    schedule 19.02.2011    source источник
comment
Почему вы используете присваивание как выражение сопоставления с образцом? Это очень запутанно. Разве вы не имели в виду f1(), когда X = что угодно?   -  person Little Bobby Tables    schedule 19.02.2011
comment
Присваивание в Erlang — это эффект сопоставления с образцом для несвязанной переменной — по крайней мере, меня это не сбивает с толку.   -  person andreypopp    schedule 19.02.2011
comment
Причина, по которой я использую присваивание в аргументах, заключается в том, что я могу использовать назначенную переменную позже в коде. Приведенный выше код слишком тривиален, чтобы показать это, но если бы я сопоставлял какой-то сложный список или кортеж, я мог бы использовать назначенную переменную позже, вместо того, чтобы вводить сложную структуру. Я предполагаю, что движок будет сопоставлять шаблон сложной структуры, а не переменной (это то, что я хочу). Мой вопрос заключается в том, верно это или нет, то есть всегда ли вышеприведенное будет соответствовать атому (что я хочу) или иногда оно совпадает с X.   -  person hello    schedule 19.02.2011


Ответы (2)


Вы можете проверить код, созданный компилятором, скомпилировав с параметром -S, который создает файл .S. Вы получите что-то вроде этого, и вы можете убедиться, что компилятор генерирует один и тот же код для каждого из ваших двух случаев.

{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.

Лично я нахожу «независимо = X» нелогичным и трудным для чтения.

person cthulahoops    schedule 19.02.2011
comment
Я тоже, но что интересно, я видел, как некоторые разработчики используют этот стиль в своем коде, где as я использую X=что угодно, поэтому я и решил задать этот вопрос (возможно, они знали больше меня?). - person hello; 19.02.2011
comment
Я предпочитаю whatever=X. Для меня = ведет себя так же, как и в теле: правая часть — это переменная/значение, а левая часть — это шаблон, с которым она сопоставляется. Это, как говорит @cthulahoops, не имеет значения для сгенерированного кода, LHS и RHS являются псевдонимами. - person rvirding; 21.02.2011

= в шаблоне означает, что левая и правая стороны являются псевдонимами, ссылающимися на одно и то же значение данных. Обе стороны должны совпадать со значением, поэтому запись чего-то {X}=[Y] никогда не будет совпадать (и компилятор будет жаловаться). Чаще всего он используется как {X,Y}=T, что позволяет вам сопоставлять и разделять данные и по-прежнему иметь ссылку на всю структуру. И иметь свой пирог, и есть его. Обратите внимание, что его можно использовать в любом месте шаблона, а не только на верхнем уровне, поэтому вы можете использовать его как {foo,[H|T]=A,B,C}.

Разницы в производительности нет.

person rvirding    schedule 20.02.2011