I was wondering if the two codes are different, because the second one returns an error message of “invalid index : nothing of type Nothing”

```
ind_one_y = findfirst(surplus[q,:,x,2,mq] .> 0.0)
Code 1 :
if isnothing(ind_one_y) == true
thr_one_y = 1e+8
else thr_one_y = grids.y[ind_one_y] - grids.mq[mq]
end
Code 2 :
thr_one_y = ifelse(isnothing(ind_one_y) == true, 1e+8, grids.y[ind_one_y] - grids.mq[mq])
```

I’m just completely lost.

nsajko
2
`ifelse`

behaves like functions do, all its arguments are evaluated. This includes `grids.y[ind_one_y]`

, which then errors.

3 Likes

Thank you very much. I didn’t realize there is such subtle difference.

nsajko
4
BTW the `== true`

in `boolean == true`

is redundant.

2 Likes

Thank you for pointing that out. A silly mistake

Note that Julia has a `?:`

ternary operator like C/C++/Java and many other languages, so you can do:

```
thr_one_y = isnothing(ind_one_y) ? 1e+8 : grids.y[ind_one_y] - grids.mq[mq]
```

If you want to do it in a single-line.

2 Likes

Benny
7
Like the ternary `?:`

operator, the `if-else`

form can also be done in one line if each branch is 1 full line:

```
# OP's code
if isnothing(ind_one_y) == true thr_one_y = 1e+8 else thr_one_y = grids.y[ind_one_y] - grids.mq[mq] end
# equivalent to Henrique's edit
thr_one_y = if isnothing(ind_one_y) 1e+8 else grids.y[ind_one_y] - grids.mq[mq] end
```

The `?`

is better at delimiting the line imo

2 Likes

Thank you very much for everyone.

Indeed, I was trying ifelse to make the three-lined code to one.

Everything looks beautiful!