2012-05-19 44 views
1

说我有一个默认参数斯卡拉可选默认参数

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

p1p2来自可选查询字符串参数在Play应用程式,例如斯卡拉类,

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

在游戏控制器行动,我想找出一种方法来动态构建参数列表时调用MyClass取决于在URL中传递的内容。例如,可能根本没有任何参数传递,在这种情况下,我将调用new MyClass,如果通过了p1,那么我会调用new MyClass(p1),其中p1是从url查询参数中提取的,您会明白。

如何在不对参数列表进行硬编码的情况下执行此操作,因为我将来可能会添加其他可选参数。是否有可能构建一个Map类似的对象与命名参数作为参数列表或类似的东西?

+0

的可能重复的[Scala中:如何使用默认值来初始化的对象(http://stackoverflow.com/questions/10472758/scala-how-to-initialize -an-object-using-default-values) – dhg

回答

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) 
+0

感谢您的快速响应,它效果很好! – Bob