How to assignment in the case condition?

phoenix
learning-elixir
#1

How to assign a variable to a value in the case condition. Is the following way correct? If a better solution exists, let me know. Your help will be highly appreciable.

    case stage_id do
      "" ->
        stage_id = JobStage.get_job_stage(job_opening_id, 1).id
    end
Getting warning: variable “s6” is unused
Case condition in the HTML template
#2
stage_id = case stage_id do
  "" -> JobStage.get_job_stage(job_opening_id, 1).id
  _ -> stage_id 
end
5 Likes
#3

It would likely generate the following warning:

Note variables defined inside case, cond, fn, if and similar do not leak. If you want to conditionally override an existing variable “stage_id”, you will have to explicitly return the variable.

1 Like
#4

No, it won’t.

This is a breaking change somewhere between 1.6 and 1.8. The warning has been removed and instead the behaviour changed.

There is no imperative assignment anymore in elixir.

#5

I should have stuck to error then:

  • [Kernel] Raise on unsafe variables in order to allow us to better track unused variables (also known as imperative assignment / variable leakage)

https://github.com/elixir-lang/elixir/releases/tag/v1.7.0
https://elixir-lang.org/blog/2016/06/21/elixir-v1-3-0-released/#deprecation-of-imperative-assignment
https://github.com/elixir-lang/elixir/issues/7403#issuecomment-368902698

Or does that mean no message at all?

https://github.com/elixir-lang/elixir/issues/8076

#6

I’m currently running 1.8.2-otp-21 and see this behaviour:

iex(1)> defmodule M do
...(1)> def f do
...(1)>   x = :outer
...(1)>   case "" do
...(1)>     "" ->
...(1)>       x = :inner
...(1)>   end
...(1)>   IO.puts x
...(1)> end
...(1)> end
warning: variable "x" is unused (if the variable is not meant to be used, prefix it with an underscore)
  iex:6
iex(2)> M.f
outer
:ok 

As you can see, I see a warning about the “inner” x not beeing used, but I do not see a warning about the imperativ assignment, instead “outer” x stays unchanged.

2 Likes
#7

OK - but there still is a warning.

warning: variable “stage_id” is unused (if the variable is not meant to be used, prefix it with an underscore)

though I’d expect the new one to be more mystifying to newcomers. And ignoring the warning will have undesirable consequences.

1 Like
#8

Thanks bro

#9

Thanks to all.