I just noticed something that I admit I should have been notice way more earlier TBH…
Variables are scoped in
cases (and I bet it’s applicable to any block).
An example with a simplified snippet:
def doing_something do a = 1 ... if some_true_condition do a = 2 ... end IO.inspect(a) # > Still 1 even if some_true_condition is true end
Now I’m even surprised of how I didn’t got any bugs so far related to this behavior I wasn’t aware.
Maybe I’ve embraced FP well more than I think (so i’m glad).
But until now I didn’t come across (or maybe I didn’t notice) any resource explaining this behavior.
And it’s a really important behavior!
I searched on hexdocs.pm and looked on almost all the guides pages on elixir-lang and this is the only result I found, a changelog for version 1.3 where the following is stated:
Elixir will now warn if constructs like
caseand friends assign to a variable that is accessed in an outer scope.
And contrary to that there isn’t any warning anymore (on v1.10 btw).
I thought replacing the
if construct by assigning from the whole block like so:
a = if some_true_condition do ... 2 end
But in this case we are still changing the value with
some_true_condition is actually false instead of doing nothing.
If you happen to have to do something equivalent (changing a value in a block) how do you handle it?
Also if you have any more information about this behavior, I’m interested to learn more.