Записи в карауле - PullRequest
       10

Записи в карауле

3 голосов
/ 23 марта 2010

Я пытаюсь использовать запись в охране, как описано здесь [1]. Если я использую краткую форму, описанную там:

handle(Msg, State) when Msg==#msg{to=void, no=3} ->

... я никогда не получу совпадение ... однако, если я полностью расширю его до:

handle(Msg, State) when Msg#msg.to==void, Msg#msg.no==3 ->

... все хорошо. Как мне кажется, с большинством документов на эрланге я читаю неправильно?

Спасибо, --tim

[1] - http://www1.erlang.org/doc/reference_manual/records.html#id2278275

Ответы [ 4 ]

11 голосов
/ 23 марта 2010

Когда вы говорите #msg{to=void, no=3} в охране, все поля, которые вы не упомянули, будут установлены в значения по умолчанию (обычно undefined). Таким образом, ваш охранник не соответствует, потому что некоторые из не перечисленных полей не совпадают.

Я стараюсь всегда использовать шаблон, а не охрану, где это возможно, поэтому я бы написал предложение как:

handle(Msg = #msg{to=void, no=3}, State) ->
    ...

Для этого шаблона требуется, чтобы сообщение Msg было отправлено в виде сообщения MSG (кортеж размером записи MSG с первым элементом msg), элемент to должен быть void, а элемент no должен быть равен 3. другие элементы записи msg могут быть чем угодно.

4 голосов
/ 23 марта 2010

Возможно, вы захотите использовать следующий шаблон вместо его краткого

handle(#msg{to=void, no=3}=Msg, State) ->
    do_stuff(Msg).

Если вам не нужно полное значение записи msg, а только какое-то поле внутри него, вы можете подобрать и уничтожить следующим образом

handle(#msg{to=void, no=3, data=Data}, State) ->
    do_stuff(Data).
4 голосов
/ 23 марта 2010

Я вижу, вы уже решили проблему. Просто примечание: в идиоматическом Эрланге вы обычно пишете совпадение так:

handle(Msg = #msg{to = void, no = 3}, State) ->

Конечно, дело доходит до вкуса, и иногда вам захочется использовать охрану, чтобы получить более приятное выравнивание линий.

0 голосов
/ 17 августа 2017

Соответствующие записи могут быть хлопотами, когда они большие. Я справляюсь с этим, проверяя первый элемент записи, который должен быть именем записи:

обрабатывать (что угодно), когда элемент (1, Msg) == msg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...