# Defining a variable according to an if-else statement

**URL:** <https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763>\
**Category:** General Usage\
**Tags:** question\
**Created:** [July 10, 2017, 2:32pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763 "2017-07-10T14:32:00Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [July 10, 2017, 2:32pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/1 "2017-07-10T14:32:00Z")

</div>

Sometimes I need to define a variable based on a branch like:

```julia
foo = []
if condition
  foo = "Julia"
else
  foo = "is awesome"
end

```

but I need to define it outside of the branch so that it becomes visible in the outside scope.

Is there a more idiomatic Julian way of achieving this result?

---

<div class="post-metadata">

**Author:** ![musm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/musm/32/3675_2.png) [@musm](https://discourse.julialang.org/u/musm)\
**Post date:** [July 10, 2017, 2:36pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/2 "2017-07-10T14:36:00Z")

</div>

Make it a local variable, e.g.

```julia

 function f(cond::Bool)
       local x

       if cond
          x = 2
       else
          x = 3
       end
       x
end

```

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [July 10, 2017, 2:45pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/3 "2017-07-10T14:45:01Z")

</div>

@musm this saves us from typing the type of the object, right? I was thinking of doing this, but wondered if another approach with [let-blocks](https://docs.julialang.org/en/release-0.4/manual/variables-and-scoping/#man-let-blocks) or something existed.

---

<div class="post-metadata">

**Author:** ![mauro3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mauro3/32/292_2.png) [@mauro3](https://discourse.julialang.org/u/mauro3)\
**Post date:** [July 10, 2017, 2:45pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/4 "2017-07-10T14:45:34Z")

</div>

But `if` blocks don’t impact scope, so this is not needed:

```julia
julia> if rand()>.5
       a = 7
       else
       b = 9
       end                                                                                                                             
9                                                                                                                                      

julia> a                                                                                                                               
ERROR: UndefVarError: a not defined                                                                                                    

julia> b                                                                                                                               
9                                                                                                                                      

julia> function foo()
       if rand()>.5
       a = 7
       else
       b = 9
       end
       @show a
       end                                                                                                                             
foo (generic function with 1 method)                                                                                                   

julia> foo()
ERROR: UndefVarError: a not defined
Stacktrace:
 [1] macro expansion at ./show.jl:243 [inlined]
 [2] foo() at ./REPL[3]:7

julia> foo()                                                                                                                           
a = 7                                                                                                                                  
7                                                                                                                                      

```

(Edited to reflect mistake pointed out by @yuyichao’s )

(but this does apply to `try` blocks, etc., which do impact scope.)

---

<div class="post-metadata">

**Author:** ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)\
**Post date:** [July 10, 2017, 2:46pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/5 "2017-07-10T14:46:41Z")

</div>

> [@juliohm](#):
>
> but I need to define it outside of the branch so that it becomes visible in the outside scope.

What gives you that impression? There was another recent thread claiming the same. Is it incorrectly mentioned in some doc somewhere or doesn’t work as intended in some cases?

---

<div class="post-metadata">

**Author:** ![yuyichao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/yuyichao/32/20_2.png) [@yuyichao](https://discourse.julialang.org/u/yuyichao)\
**Post date:** [July 10, 2017, 2:51pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/6 "2017-07-10T14:51:34Z")

</div>

> [@mauro3](#):
>
> @show isdefined(:a), isdefined(:b)

This does not check local variables.

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [July 10, 2017, 2:57pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/7 "2017-07-10T14:57:17Z")

</div>

@yuyichao for some reason I assumed this didn’t work. I don’t know if it is because of an experience with a previous version of Julia, but I remember having issues with scope in this context in the past. I just tried it without predeclaring the variable and it works just fine. 😊

---

<div class="post-metadata">

**Author:** ![anon94023334](https://avatars.discourse-cdn.com/v4/letter/a/e274bd/32.png) [@anon94023334](https://discourse.julialang.org/u/anon94023334)\
**Post date:** [July 10, 2017, 2:58pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/8 "2017-07-10T14:58:32Z")

</div>

Why not use a ternary operator?

```julia
foo = condition ? "Julia" : "is awesome"

```

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [July 10, 2017, 2:59pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/9 "2017-07-10T14:59:34Z")

</div>

@anon94023334, my conditions don’t fit in a line, I do the ternary operator whenever I can to increase code coverage 🙂

---

<div class="post-metadata">

**Author:** ![Tamas\_Papp](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tamas_papp/32/25949_2.png) [@Tamas\_Papp](https://discourse.julialang.org/u/Tamas_Papp)\
**Post date:** [July 10, 2017, 3:00pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/10 "2017-07-10T15:00:15Z")

</div>

Others have cleared up your misunderstanding, so I just want to add

```julia
foo = if condition
    "Julia"
else
    "is awesome"
end

```

which is of course more commonly written using the ternary operator (`?:`).

---

<div class="post-metadata">

**Author:** ![mauro3](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mauro3/32/292_2.png) [@mauro3](https://discourse.julialang.org/u/mauro3)\
**Post date:** [July 10, 2017, 3:00pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/11 "2017-07-10T15:00:36Z")

</div>

This also works:

```julia
foo = if cond
 ...
else
 ...
end

```

---

<div class="post-metadata">

**Author:** ![anon94023334](https://avatars.discourse-cdn.com/v4/letter/a/e274bd/32.png) [@anon94023334](https://discourse.julialang.org/u/anon94023334)\
**Post date:** [July 10, 2017, 3:00pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/12 "2017-07-10T15:00:40Z")

</div>

Depending on how complex things are, you can create a function that encompasses your conditions, but you’ve probably already decided against ternary operators for other reasons.

---

<div class="post-metadata">

**Author:** ![juliohm](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/juliohm/32/215266_2.png) [@juliohm](https://discourse.julialang.org/u/juliohm)\
**Post date:** [July 10, 2017, 3:07pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/13 "2017-07-10T15:07:53Z")

</div>

I like this one! Clean and express the intent perfectly.

---

<div class="post-metadata">

**Author:** ![snystrom](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/snystrom/32/7026_2.png) [@snystrom](https://discourse.julialang.org/u/snystrom)\
**Post date:** [July 10, 2017, 3:40pm UTC](https://discourse.julialang.org/t/defining-a-variable-according-to-an-if-else-statement/4763/14 "2017-07-10T15:40:19Z")

</div>

Use a ternary operator?  
foo = (condition ? “Julia” : “is awesome”)
