2016-11-01 5 views
0

So rufen Sie zwei val: foo1 und foo2 nach dem Zufallsprinzip.Verwenden einer Variablen in Wertname

Ich habe es geschafft, den Namen als String zu generieren, aber wie kann ich es in einen Wertnamen konvertieren, um den Wert anstelle des Namens zu drucken.

val r = scala.util.Random 

val foo0 = 10 
val foo1 = 5 

println("foo"+r.nextInt(2)) 

gibt foo0 oder foo1 als ich 10 möchte oder 5

Antwort

2

Sie können technisch dies mit Reflexion, aber man sollte nicht .

class Foo { 
    val foo0 = 10 
    val foo1 = 5 
} 

val r = new scala.util.Random 

scala> val foo = new Foo 
foo: Foo = [email protected] 

scala> foo.getClass.getDeclaredMethod("foo" + r.nextInt(2)).invoke(foo).asInstanceOf[Int] 
res19: Int = 10 

Auch wir sollten nicht dies tun. Es wird deinen Code in ein ausgedehntes Durcheinander eines Minenfeldes verwandeln.

Wenn Sie jemals Dinge mit Indizes wie foo0, foo1, foo2, usw. finden, das heißt, sie gehören wahrscheinlich in einer Sammlung von irgendeinem Typ.

val foos = List(10, 5) 

Dann können Sie sie durch den Index zugreifen apply mit:

foos.apply(r.nextInt(2)) 

scala> foos(r.nextInt(2)) 
res20: Int = 5 
2

die nicht in einer statisch typisierten Sprache funktioniert. Ziemlich sicher, dass es in jeder dynamischen Sprache auch schlecht ist.

Versuchen:

List(foo0, foo1)(r.nextInt(2)) 
Verwandte Themen