Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何通过配置文件指定类型参数?_Scala_Playframework_Akka - Fatal编程技术网

Scala 如何通过配置文件指定类型参数?

Scala 如何通过配置文件指定类型参数?,scala,playframework,akka,Scala,Playframework,Akka,我正在使用Scala/Akka/Play构建一个市场模拟器。我有一个阿克卡演员和两个孩子。孩子们需要有我想指定为参数的特定类型 假设我有下面的类定义 case class SecuritiesMarket[A <: AuctionMechanismLike, C <: ClearingMechanismLike](instrument: Security) extends Actor with ActorLogging { val auctionMechanism: Act

我正在使用Scala/Akka/Play构建一个市场模拟器。我有一个阿克卡演员和两个孩子。孩子们需要有我想指定为参数的特定类型

假设我有下面的类定义

case class SecuritiesMarket[A <: AuctionMechanismLike, C <: ClearingMechanismLike](instrument: Security) extends Actor
  with ActorLogging {

  val auctionMechanism: ActorRef = context.actorOf(Props[A], "auction-mechanism")

  val clearingMechanism: ActorRef = context.actorOf(Props[C], "clearing-mechanism")

  def receive: Receive = {
    case order: OrderLike => auctionMechanism forward order
    case fill: FillLike => clearingMechanism forward fill
  }

}
在为特定模型/模拟创建
SecuritiesMarket
实例时,我可能会使用拍卖机制类型和清算机制类型的许多可能组合


我可以在
application.conf
文件中指定我希望在给定模拟中使用的类型参数吗?

我在这里看到两个问题

我可以从字符串中获取
实例吗?

您仍然需要强制转换,因为
forName
返回
Class[\u]

我可以用编译时未知的类型参数实例化类型吗? 有点像,但不是真的

object SecuritiesMarket {
    def apply[A, C](clsAuc: Class[A], clsClr: Class[C])(security: Security): SecuritiesMarket[A, C] = {
        SecuritiesMarket[A, C](security)
    }
}

我认为拍卖机制和清算机制是
SecurityMarket
的依赖关系。我猜你会以某种方式(如何?)在它的构造函数中实例化它们。如果是这样,为什么不把它们作为构造函数参数传入呢

编辑:

我不知道如何在SecurityMarket中创建儿童演员

在评论中回答这个问题
Props[T]
也可以写成
Props[T](classOfT)
,可以简化为
Props(classOfT)
。这三个是一样的。因此,以下代码:

val auctionMechanism: ActorRef = context.actorOf(Props[A], "auction-mechanism")
可替换为:

val classOfA = Class.forName("path.to.A")
val auctionMechanism: ActorRef = context.actorOf(Props(classOfA), "auction-mechanism")

首先,application.conf是一个运行时工件,据我所知,它的内容通常不会在编译时解析。当文件在运行时被解析时,解析器创建一个类Config的实例,然后该实例控制Akka设置

Typesafe配置库项目自述非常好,链接文档包含所有详细信息:

其次,由于类型擦除,模板参数在运行时不可用,所以通常不能使用application.conf控制模板。您可以创建一个自定义构建步骤来解析application.conf并在编译之前修改代码,但这可能不是您想要的。(如果您确实需要自定义构建步骤,可能需要使用不同的.conf。)


相反,您可以尝试简单地删除securities market类的类型参数。然后创建拍卖和清算参与者的单一、简单的实现。通过从application.conf中读取各个机制的名称,反射地实例化配置的机制,并委托给实例化的机制来实现这些参与者。机制类可以独立于Akka,如果您将大部分逻辑保存在Akka中,这可能会更好?

始终可以匹配从conf文件读取的字符串。虽然可能有更好的方法。实际上,拍卖机制和清算机制是
SecurityMarket
的依赖项。它们的
ActorRefs
通过
context.actorOf
调用在上面的代码中实例化。如果我创建了
AuctionMechanismLike
ClearingMechanismLike
的实例,然后将它们作为构造函数参数传递,我不知道如何在
SecurityMarket
中创建子参与者,如果类型参数值是在
application.conf
文件中指定的,那么这些值在编译时不是已知的吗?代码是根据各种*.conf文件中包含的信息编译的?还是不?类型系统在其神奇的编译时工作。如果您的代码经过编译,那么您就有了类型保证(嗯,有点)。我在回答中添加了一些其他内容…谢谢你澄清这一点。鉴于
application.conf
是一个运行时对象,也许我应该在编译时连接依赖项?可以这样做吗?当然可以,这样可以避免反思。最简单的方法是将证券市场分类专门化,以满足您需要的拍卖和清算机制的不同组合。是的,您可能会得到很多专门化类,但每一个都只是一行左右的代码。您也可以使用注入库,如Spring或Guice。application.conf可以引用bean标识符。bean定义将引用拍卖和清算机制bean。也许这符合要求?好的。因此,使用Spring,我可以指定我想要使用的依赖项的编译时连接,以便创建各种市场,然后在
application.conf
中,我有效地指定了我想要用于特定模拟的特定组合。这将允许我避免以使用Spring(或Guice)为代价写出所有不同的市场组合。我的权衡是否正确?
val auctionMechanism: ActorRef = context.actorOf(Props[A], "auction-mechanism")
val classOfA = Class.forName("path.to.A")
val auctionMechanism: ActorRef = context.actorOf(Props(classOfA), "auction-mechanism")