How to assignment in the case condition?

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
stage_id = case stage_id do
  "" -> JobStage.get_job_stage(job_opening_id, 1).id
  _ -> stage_id 
end
7 Likes

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

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.

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)

Release v1.7.0 · elixir-lang/elixir · GitHub
Elixir v1.3 released - The Elixir programming language
Assignments from within 'if' statements · Issue #7403 · elixir-lang/elixir · GitHub

Or does that mean no message at all?

Imperative Assignements are breaking the application in 1.7 update · Issue #8076 · elixir-lang/elixir · GitHub

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

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

Thanks bro

Thanks to all.