1

假设我有一个带有默认参数的 Scala 类

class MyClass(p1: Int = 0, p2: Int = 1)

p1并且p2来自 Play 应用程序中的可选查询字符串参数,例如,

http://mysite.com/blah?p1=10&p2=20 

在 Play 控制器操作中,我试图找出一种在调用时MyClass根据 url 中传递的内容动态构造参数列表的方法。例如,可能根本没有传递参数,在这种情况下我会调用new MyClass,如果p1传递了,那么我会调用new MyClass(p1)从 url 查询参数中提取 p1 的位置,你明白了。

如何在不对参数列表进行硬编码的情况下做到这一点,因为我将来可能会添加其他可选参数。是否可以构造一个Map带有命名参数的 -like 对象作为参数列表或类似的东西传递?

4

1 回答 1

3

您可以实现一个采用 Map 的辅助构造函数。如果您不想重复默认值,则可以将它们作为常量。

val p1Default = 0
val p2Default = 1

class MyClass(p1: Int = p1Default, p2: Int = p2Default) {
  def this(m: Map[String, Int]) =
    this(m.getOrElse("p1", p1Default), m.getOrElse("p2", p2Default))
}

用法:

new MyClass(p1 = 5, p2 = 6)
new MyClass(Map("p1" -> 5))
new MyClass(p2 = 6)
于 2012-05-19T17:10:34.700 回答