开发者

Perform bridge assignment in scala

开发者 https://www.devze.com 2023-01-08 14:23 出处:网络
I want to do this: var (a, b) = (0, 0) a = (b = 100) but Scala is complaining that error: type mismatch;

I want to do this:

var (a, b) = (0, 0)
a = (b = 100) 

but Scala is complaining that

error: type mismatch;
 found   : Uni开发者_如何学编程t
 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?


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


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>


Why ask why? Assignment expressions have type Unit and that's how it is. No chained assignments. Period.


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"...


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)
0

精彩评论

暂无评论...
验证码 换一张
取 消