Warning: this clause cannot match because a previous clause
Таким примером может служить функция от двух аргументов, где эти аргементы - рекорды. Если мы в верхнем кейсе указываем рекорды,
ничего в них не матча, а нижний делаем такой же, но матчим по полю одного из рекорда, компилятор нам не скажет, что во второй кейс мы никогда не попадем.
Пример:
-module('1'). -record(record_1,{arg}). -record(record_2,{}). -export([foo/2]). foo(#record_1{},#record_2{})-> {ok,1}; foo(#record_1{arg=1},#record_2{}) -> {ok,2}. :~/rep/vcs/apps/vcs_core/src$ erl Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.9.2 (abort with ^G) 1> c("1.erl"). {ok,'1'}
Хотя на более простой код, компилятор охотно ругнется:
-module('1'). -record(record_1,{arg}). -record(record_2,{}). -export([foo/2]). foo(#record_1{},_)-> {ok,1}; foo(#record_1{arg=1},#record_2{}) -> {ok,2}. :~/rep/vcs/apps/vcs_core/src$ erl Erlang R15B02 (erts-5.9.2) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false] Eshell V5.9.2 (abort with ^G) 1> c("1.erl"). 1.erl:17: Warning: this clause cannot match because a previous clause at line 15 always matches {ok,'1'}
Говорить о том почему это опасно, я думаю излишне. :)
foo(#record_1{},#record_2{})-> {ok,1};
--
--
Страница рассылки: http://groups.google.com/group/erlang-russian
Новости: http://erlanger.ru
Чат: xmpp://erl...@conference.jabber.ru
Чат для оффтопа: xmpp://erlang...@conference.jabber.ru
Правила, действующие в чате и рассылке: http://erlanger.ru/ru/erlang-at-conference-jabber-ru
Написать письмо: erlang-...@googlegroups.com
Отписаться: erlang-russia...@googlegroups.com
---
Вы получили это сообщение, поскольку подписаны на группу Erlang по-русски.
Чтобы отказаться от подписки на эту группу и перестать получать из нее сообщения, отправьте электронное письмо на адрес erlang-russia...@googlegroups.com.
Настройки подписки и доставки писем: https://groups.google.com/groups/opt_out.
Это не баг. Рекорды в заголовках и кейсах, если в них значение не прописано для данного поля, матчатся с любым значением этого поля. Т.е.
func(#record{}) ->
ok.
равнозначно
func(#record{param1=_, ..., paramN=_}) ->
ok.
Очень похоже действительно на какой-то баг.Напиши в основную рассылку.
--
Очень похоже действительно на какой-то баг.Напиши в основную рассылку.
Ой, не дочитал. Да, похоже на баг. Компилятор должен здесь тоже ругаться