【问题标题】:Scala: Assign names to anonymous objects in ListScala:为列表中的匿名对象分配名称
【发布时间】:2020-05-17 15:28:15
【问题描述】:

我想知道如何通过字段来命名列表中的对象

case class age(id: Int,name:String,age:Int)
val people: List[age] = List(age(2,"Angela",31),age(3,"Rick",28))

在这个最小示例中,我想创建对象 Angela 和 Rick。

我最初的想法:

val objects: List[age] = people.map( x => {val x.name = new age(x.name,x.age) })

当然 val x.name 不起作用,因为你不能在变量名中使用变量名。

这不是项目的实际问题,而是我坚持的概念。

【问题讨论】:

  • 列表中的数据是动态的还是静态的?如果是静态的,你可以自己定义变量,或者如果你想花哨的话,可以编写一个宏。如果它们是动态的,那么您不能简单地创建新成员,如果您不知道哪些将存在,您将如何使用它们?

标签: list scala dictionary object


【解决方案1】:

不清楚你的意图是什么。您要创建名为angelarick 的变量吗?对于少量列表元素和大量列表元素,您可以手动执行此操作,这没有意义,因为您将如何使用 100 个变量? 您似乎在谈论从名称到属性的一些映射,然后 Map 可能最适合您

val peopleMap: Map[String,age] = people.map(p => p.name -> p). // this will create list of pairs
                toMap //  this will turn it to a Map

pritnln(peopleMap("Angela")) // now you can use person name to get all the info about them

【讨论】:

    【解决方案2】:

    一个简单的解决方案是使用地图:

    case class Person(id: Int, name: String, age: Int)
    val people: List[Person] = List(Person(2, "Angela", 31), Person(3, "Rick", 28))
    
    val peopleByName: Map[String, Person] = people // List[Person]
      .map(p => (p.name, p))                       // List[(String, Person)]
      .toMap                                       // Map[String, Person]
    

    或者,以Map 开头,而不是List

    case class Person(id: Int, age: Int)
    
    val peopleByName: Map[String, Person] = Map(
      "Angela" -> Person(2, 31), // (String, Person)
      "Rick" -> Person(3, 28)    // (String, Person)
    )                            // Map[String, Person]
    

    但是,如果您想在运行时定义一个成员,那么您必须扩展 Dynamic 特征(代码 sn-p 来自 here,导入是我的(必需,否则编译器会不高兴)):

    import scala.language.dynamics
    
    class DynImpl extends Dynamic {
      def selectDynamic(name: String) = name
    }
    
    scala> val d = new DynImpl
    d: DynImpl = DynImpl@6040af64
    
    scala> d.foo
    res37: String = foo
    
    scala> d.bar
    res38: String = bar
    
    scala> d.selectDynamic("foo")
    res54: String = foo
    

    如果你真的想这样做,那么我建议这个实现:

    class DynamicPeople(peopleByName: Map[String, Person]) extends Dynamic {
      def selectDynamic(name: String) = peopleByName(name)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多