On Sat, Aug 22, 2015 at 2:49 PM, Tero Frondelius
<[email protected]> wrote:
> Why testvariable is not incremented?
>
> function incrementvariable(numb)
>     numb += 1
> end
> function testing()
>     global testvariable = 0
>     for i = 1:3
>         incrementvariable(Ptr{testvariable})
>     end
>     println(testvariable)
> end

`+=` is an assignment and not (necessarily) a mutation. A function
cannot change the binding of a variable in another scope.

What you can do is to mutate the value/object passed in if it is a
mutable type. The way you are using below is a good example of that.
On 0.4 you can use the Ref type instead. (Or simple write you own
counter type `type Counter count::Int end` and use `counter.count +=
1` to increment it).

As Sisyphuss points out, if you just need a simple local counter, you
don't need to write a incrementvariable function for that.

If you only need one, a global variable is probably the best choice.
If you are worrying about performance, a mutable const global (either
an length-1 array or a Ref or custom counter type) should do it.

If you want a local counter that is shared between different functions
(by passing as argument), the way you have below (or a modified
version as mentioned above) is probably the best way.

>
> Or actually what should I change to get the testvariable incremented? I'm
> counting how many times one case inside the function incrementvariable is
> called. I will use this information later in the testing() function.
>
> This will work, but it doesn't look elegant:
> function incrementvariable(numb)
>     numb[1] += 1
> end
> function testing()
>     testvariable = [0]
>     for i = 1:3
>         incrementvariable(testvariable)
>     end
>     println(testvariable)
> end
>
>
>

Reply via email to