7

I declared a variable outside the function like this:

var s: Int = 0

passed it such as this:

def function(s: Int): Boolean={

   s += 1

   return true

}

but the error lines wont go away under the "s +=" for the life of me. I tried everything. I am new to Scala btw.

7
  • 1
    possible duplicate of Can Scala call by reference? Commented Mar 29, 2013 at 14:48
  • 1
    why would you want to increment the value in a function? Just return the new value. You are reassigning the value you passed in. Commented Mar 29, 2013 at 14:49
  • i am doing something else with the value. this is just a small example of what my problem was. Commented Mar 29, 2013 at 14:51
  • You cannot do this, you are really calling s = s + 1 so you are simply reassigning your local pointer to a new variable. Commented Mar 29, 2013 at 14:52
  • 1
    @JL all you can do in this particular case is to wrap int into say MutableInt container, that has operation increment and then pass it to function and invoke that method. You might think that this is a lot of overhead and indeed it is: you're going straight against language concepts. Commented Mar 29, 2013 at 14:54

5 Answers 5

4

First of all, I will repeat my words of caution: solution below is both obscure and inefficient, if it possible try to stick with values.

implicit class MutableInt(var value: Int) {
  def inc() = { value+=1 } 
}

def function(s: MutableInt): Boolean={
   s.inc() // parentheses here to denote that method has side effects
   return true
}

And here is code in action:

scala> val x: MutableInt = 0 
x: MutableInt = MutableInt@44e70ff

scala> function(x)
res0: Boolean = true

scala> x.value
res1: Int = 1
Sign up to request clarification or add additional context in comments.

1 Comment

@JL I hope you're not going to seriously use this "solution" for anything, and I don't think that was om-nom-nom's intention.
3

If you just want continuously increasing integers, you can use a Stream.

val numberStream = Stream.iterate(0)(_ + 1).iterator

That creates an iterator over a never-ending stream of number, starting at zero. Then, to get the next number, call

val number: Int = numberStream.next

Comments

1

I have also just started using Scala this was my work around.

var s: Int = 0

def function(s: Int): Boolean={

   var newS = s
   newS = newS + 1 
   s = newS
   return true

}

From What i read you are not passing the same "s" into your function as is in the rest of the code. I am sure there is a even better way but this is working for me.

Comments

0

You don't.

A var is a name that refers to a reference which might be changed. When you call a function, you pass the reference itself, and a new name gets bound to it.

So, to change what reference the name points to, you need a reference to whatever contains the name. If it is an object, that's easy enough. If it is a local variable, then it is not possible.

See also call by reference, though I don't think this question is a true duplicate.

Comments

-1

If you just want to increment a variable starting with 3

val nextId = { var i = 3; () => { i += 1; i } }

then invoke it:

nextId()

1 Comment

This doesn't actually address the question (which was asked, and answered, 4 years ago).

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.