
Question:
I want to do this:
var (a, b) = (0, 0) a = (b = 100)
but Scala is complaining that
error: type mismatch; found : Unit required: Int
What I want is to assign a and b to the same value. Why Scala make it Unit where it should be Int?
Solution:1
Why ask why? Assignment expressions have type Unit
and that's how it is. No chained assignments. Period.
Solution:2
Your statement is an assignment, which returns Unit. See this related question for reasons why. You can do this, if you want:
scala> var (a,b) = (0,0) a: Int = 0 b: Int = 0 scala> a = {b = 100; b} a: Int = 100
Solution:3
scala> var a,b,c,d,e,f,g = 0 a: Int = 0 b: Int = 0 c: Int = 0 d: Int = 0 e: Int = 0 f: Int = 0 g: Int = 0 scala> var f,i,j,k,m,n,o = new Object{} f: java.lang.Object = $anon$1@11ce012 i: java.lang.Object = $anon$2@baf4ae j: java.lang.Object = $anon$3@15e68d k: java.lang.Object = $anon$4@1d3633c m: java.lang.Object = $anon$5@118317f n: java.lang.Object = $anon$6@15998cb o: java.lang.Object = $anon$7@13e6f83 scala>
Solution:4
You can define a special assignment operator (it must end with a colon as it must be right associative) for your own types, or write a generic wrapper (including implit conversions) for general types. I wouldn't recommend to actually use this, but here it goes:
case class M[T](var t:T) { def =: (m: M[T]):M[T] = {m.t = t ; this} } implicit def anyToM[T](v:T) = M(v) implicit def mToAny[T](m:M[T]) = m.t def main(args: Array[String]) { var a = M(0) var b = M(0) var c = M(0) a =: b =: c =: 100 println(a + b + c) //--> 300 }
I think it is always a bad idea to summon heavy magick in order to save a few keystrokes. In Germany we would call this "to shoot sparrows with a cannon"...
Solution:5
case class assign[T](v: T) { def to(vals: (T => Unit)*) { vals.foreach{ vv => vv(v) } } } var (a,b) = (0,0) assign(39) to (a = _, b = _) assert(a == 39) assert(b == 39)
Or you can rename it to emulate a rather simple version of a with
statement.
with(20) do (a = _, b = _, print)
Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
EmoticonEmoticon