This is part of the Semicolon&Sons Code Diary - consisting of lessons learned on the job. You're in the dumb-mistakes-and-gotchas category.
Last Updated: 2024-11-21
. Be careful of precedence when using logical AND and OR in the same statement... it might not be in the order the code has it
I had
@code_diary = CodeDiary.in_category(@category).find do |code_diary|
code_diary[:name] == params[:name]
end || raise_not_found and return
@name = ...
I noticed that @name
was never set.
This was because my code boiled down to
a || b and c
If a
was not nil
, my expectation was that neither the raise_not_found
nor the return
would be called.
However the ||
operator was evaluated first, making things
(a || b) and c
i.e. c
was always evaluated.
Takeaways:
||
is evaluated before and