Dans scala, existe-t-il un moyen d'accéder à un membre de classe, mais le nom du membre est un var? Vous trouverez ci-dessous un extrait de code, il y a un membre de classe appelé "one_star". J'ai un var dont la valeur est "one_star", et je veux utiliser ce var comme nom de membre de la "case class".

case class Features(
  // star about
  var one_star: String = "0",
  var two_star: String = "0",
  var three_star: String = "0",
  var four_star: String = "0",
  var five_star: String = "0"

  // other about
)

object Features {
  def apply(): Features = {
    val features = new Features()
    var testVar = "one_star"
    features.${testVar} = "1"
    features
  }
}
3
xuhai 11 août 2017 à 05:48

2 réponses

Scala est un langage de type statique et n'autorise pas ces constructions de langage. Mais vous pouvez utiliser la réflexion (manière difficile) ou la correspondance de motifs avec un code comme celui-ci (manière simple):

class Features (
  var one_star: String = "0",
  var two_star: String = "0",
  var three_star: String = "0",
  var four_star: String = "0",
  var five_star: String = "0") {

  def setField(field: String, value: String): Unit = {
    field match {
      case "one_star" => one_star = value
      case "two_star" => two_star = value
      case "three_star" => three_star = value
      case "four_star" => four_star = value
      case "five_star" => five_star = value
    }
  }
}
0
Ruslan K. 11 août 2017 à 03:27

Ceci est possible en utilisant scala-reflect, bien que dans la plupart des cas, je ne le recommanderais pas.

import scala.reflect.runtime.universe._

val field = typeOf[Features].decl(TermName(testVar)).asTerm.accessed.asTerm
val mirror = runtimeMirror(classOf[Features].getClassLoader)
mirror.reflect(features).reflectField(field).set("1")

Êtes-vous sûr de ne pas vouloir utiliser ou étendre Map[String, String] pour votre cours? Tant de propriétés ne sont pas typiques.

0
ephemient 11 août 2017 à 04:56