假设我有一个带默认参数的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)
,其中p1是从url查询参数中提取的,你明白了。
如何在不对参数列表进行硬编码的情况下执行此操作,因为我可能会在将来添加其他可选参数。是否有可能构造一个具有命名参数的Map
类对象作为参数列表或类似的东西传递?
答案 0 :(得分: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)