Scala:基于用户输入在trait中初始化val

Scala:基于用户输入在trait中初始化val,scala,traits,Scala,Traits,我的项目中有一个特性,我将其用作配置文件,类似于: trait config { val people = Seq("John","Jessie") } 此特性与我的所有对象(主对象除外)中的扩展一起使用。我想做的是根据用户在我的main函数中收到的args为people分配一个不同的值,因此我将有如下内容: trait config { val people = args.head match { case "A" => Seq("John","Jessie")

我的项目中有一个特性,我将其用作配置文件,类似于:

trait config {
   val people = Seq("John","Jessie")
}
此特性与我的所有对象(主对象除外)中的扩展一起使用。我想做的是根据用户在我的
main
函数中收到的
args
people
分配一个不同的值,因此我将有如下内容:

trait config {
   val people = args.head match {
      case "A" => Seq("John","Jessie")
      case "B" => Seq("Bill","James","Brad")
      case _ => Seq("Jimmy")
 }}

有没有办法做到这一点?

你所要求的是可能的:

trait config {
  app: App =>

  lazy val people = args.head match {
    case "A" => Seq("John","Jessie")
    case "B" => Seq("Bill","James","Brad")
    case _ => Seq("Jimmy")
  }
}

object Main extends App with config {
  people.mkString
}
或者你可以减少这种特性,使其适用于应用程序以外的其他类型

trait config {
  protected def args: Array[String]

  lazy val people = args.head match {
    case "A" => Seq("John","Jessie")
    case "B" => Seq("Bill","James","Brad")
    case _ => Seq("Jimmy")
  }
}
然而,正如已经指出的那样,这不是一个好的模式


如果您想提供一个系统范围的配置,您可能需要查看一下您所要求的:

trait config {
  app: App =>

  lazy val people = args.head match {
    case "A" => Seq("John","Jessie")
    case "B" => Seq("Bill","James","Brad")
    case _ => Seq("Jimmy")
  }
}

object Main extends App with config {
  people.mkString
}
或者你可以减少这种特性,使其适用于应用程序以外的其他类型

trait config {
  protected def args: Array[String]

  lazy val people = args.head match {
    case "A" => Seq("John","Jessie")
    case "B" => Seq("Bill","James","Brad")
    case _ => Seq("Jimmy")
  }
}
然而,正如已经指出的那样,这不是一个好的模式


如果要提供系统范围的配置,您可能需要查看一下

,这不太可能是配置类型数据的最佳模式。您可以有一个包含您想要的任何配置数据的特性,但是您必须包含它并为每个对象填充它。听起来好像你想用已经存在的配置数据定义trait,这样你就可以扩展它而不必填充它,但这是不可能的。然而,如果你能做到这一点,那也不是一个坏主意,因为数据不会被共享。在每个对象中都会有不同的实际对象扩展它,这将是低效的。我会研究依赖注入。对不起,我在它完成之前无意中提交了我的评论,因为我显然不擅长使用这个编辑器。谁知道新台词这么难呢?:)那么,向所有必需的对象和类注入所有配置参数的好方法是什么呢?首先,您只能在
main
方法(或更进一步)中以这种方式定义
trait
,但这可能是您想要做的。其次,我建议将
match
部分移出
trait
,这样在实例化扩展类时就不会执行它。@IdanWaisman如果
match
是在
trait
之外执行的,那么数据将被共享。每次实例化时调用setter需要做一些工作,但不会太多。这不太可能是配置类型数据的最佳模式。您可以有一个包含您想要的任何配置数据的特性,但是您必须包含它并为每个对象填充它。听起来好像你想用已经存在的配置数据定义trait,这样你就可以扩展它而不必填充它,但这是不可能的。然而,如果你能做到这一点,那也不是一个坏主意,因为数据不会被共享。在每个对象中都会有不同的实际对象扩展它,这将是低效的。我会研究依赖注入。对不起,我在它完成之前无意中提交了我的评论,因为我显然不擅长使用这个编辑器。谁知道新台词这么难呢?:)那么,向所有必需的对象和类注入所有配置参数的好方法是什么呢?首先,您只能在
main
方法(或更进一步)中以这种方式定义
trait
,但这可能是您想要做的。其次,我建议将
match
部分移出
trait
,这样在实例化扩展类时就不会执行它。@IdanWaisman如果
match
是在
trait
之外执行的,那么数据将被共享。每次实例化时调用setter需要做一些工作,但不是很多。如何使用Typesafe执行我需要的操作?如何使用Typesafe执行我需要的操作?