Сопоставление шаблонов Erlang с псевдонимами

есть ли возможность сопоставить в определении функции какое-то подмножество кортежа и при этом получить полный кортеж в методе?

Я хотел бы сделать что-то вроде этого:

myfun({ foo, Bar }: Var) -> otherfunction(Var, stuff).

вместо:

myfun({ foo, Bar }) -> otherfunction({ foo, Bar }, stuff).

Надеюсь, это достаточно ясно.

Спасибо.


person ptriller    schedule 04.11.2009    source источник
comment
Не могли бы вы перефразировать свой вопрос? Мне не очень понятно...   -  person Roberto Aloi    schedule 05.11.2009
comment
Ну, я, вероятно, должен отказаться от него, вы ответили на него за меня, часть = Var была тем, что я искал. Оглядываясь назад, RTFM был бы правильным ответом.   -  person ptriller    schedule 05.11.2009


Ответы (3)


Вы можете игнорировать некоторые параметры, поставив перед ними символ подчеркивания. Например.

myfun( {foo, _Bar, Var } )

будет соответствовать, игнорируя параметр _Bar. Это то, что вы имели в виду?

Или вы имели в виду:

myfun( {foo, Bar} = Var ) -> otherfun( Var ).

в этом случае Var будет использоваться в otherfun, если совпадение с myfun прошло успешно. Причина в том, что Var не привязан во время вычисления выражения и поэтому будет присвоен {foo, Bar}.

person jldupont    schedule 04.11.2009
comment
игнорировать параметр _Bar не совсем корректно. Переменная _Bar будет привязана ко второму элементу кортежа и может использоваться как любая обычная переменная. Поскольку _Bar начинается с _, компилятор не будет предупреждать о том, что он не используется. Кроме того, _Bar ведет себя как обычная переменная и может использоваться как таковая. - person rvirding; 05.11.2009

Возможно, это то, что вы имели в виду:

myfun({foo, Bar } = Var) ->
  otherfunction(Var, stuff).

Таким образом, вы можете экспортировать свою функцию как myfun/1 (один параметр). Он будет соответствовать только кортежам с двумя элементами. Первым должен быть атом "foo", а вторым может быть что угодно. Вы получите функциональное предложение во всех остальных случаях, если вы не укажете другие предложения для функции. Например, имеет смысл иметь:

myfun({foo, Bar } = Var) ->
  otherfunction(Var, stuff);
myfun(Var) ->
  {error, bad_format}.

Однако я не совсем уверен, что это то, о чем вы спрашиваете. Пожалуйста, дайте мне знать, если это помогло.

person Roberto Aloi    schedule 04.11.2009

Если я правильно понял, то вы хотите, чтобы Var было установлено, содержа только пару, соответствующую { foo, Bar }, без необходимости выполнять какие-либо дополнительные проверки для краткости. Насколько я когда-либо видел, вы не можете сделать это в Erlang. Прости. :)

person scott_karana    schedule 04.11.2009
comment
Это неправильно. Как показывают два других сообщения, вы действительно можете делать то, что он просит. - person Jeremy Wall; 05.11.2009