Во многих ситуациях мне нужно сопоставить шаблон как с самой структурой, так и с ее полями, и приступить к выполнению некоторых дальнейших действий, когда некоторые промежуточные результаты не пусты.
Однако сама структура может быть nil
в первую очередь. В результате я написал несколько вложенных совпадений, например
experiment = Repo.get(Experiment, experiment_id)
case experiment do
nil ->
# Error 1
_ ->
case experiment.active do
false -> # Error 2
true ->
case Repo.all(assoc(experiment, :experiment_results)) do
[] -> # Error 3
results -> # Do stuffs
end
end
В идеале я хотел бы написать код без особой вложенности.
Как я могу изменить код?
(Обратите внимание, что мой первоначальный вопрос был о сопоставлении с образцом в структуре, когда это могло бы быть nil
. Мой фактический вариант использования шире, чем предполагал мой первоначальный вопрос, поэтому я обновил вопрос.)
Оригинальный код, к которому применяются ответы Алексея Матюшкина и Шехаряра:
experiment = Repo.get(Experiment, experiment_id)
case experiment do
nil ->
:error
_ ->
case experiment.active do
false -> :error
true -> # Do stuffs
end
end