表示使用默认值

时间:2015-12-07 15:54:08

标签: scala implicit

在Scala我希望有类似的东西

TokenizerExample.scala

class TokenizerExample private (whateva : Any)(implicit val separator : Char = '.') {

    def this(data2Tokenize : String)(implicit s : Char) {
        this("", s) //call to base constructor
    }

    def this(data2Tokenize : Array[Char])(implicit s : Char) { {
        this("", s) //call to base constructor
    }

}

我想要实现的是允许用户调用两个公共构造函数中的任何一个提供或不提供分隔符,但如果它们不提供分隔符自动获取基础构造函数中的那个,我想知道是否有一个值可以传递给基础构造函数,以便scala使用私有基构造函数的默认值。

我想避免它在每个构造函数中执行下一步

    def this(_3rdConstructor : SytringBuilder)(implicit s : Char = '.')  ...

我尝试了许多不同的方法,值是隐式的,分隔符为Option,但我没有得到我真正喜欢的结果,特别是因为scala抱怨多个隐式值构造者(这种方式违背了拥有它们的目的)。有没有办法在没有

的情况下以一种很好的方式实现这种行为
  • 1)强制用户提供分隔符。
  • 2)通过传递空值然后验证它们来进入“bad-practices”(特别是因为这不允许我的分隔符在构造函数中成为val
  • 3)创造另一种语言只因为我不喜欢其中一个小小的东西:)。

1 个答案:

答案 0 :(得分:1)

我强烈建议你不要为此目的使用implicits。解决方案规则相当复杂,它使得代码非常难以遵循,因为几乎不可能知道构造函数在没有调试器的情况下最终会接收到什么值。

如果你要做的就是避免在多个地方定义默认值,只需在配套对象中定义它:

object Foo {
    val defaultParam = ','
}
class Foo {
   import Foo.defaultParam
   def this(data: String, param: Char = defaultParam) = ???
   def this(data: List[Char], param: Char = defaultParam) = ???
   // etc ...
}

如果你坚持使用implicits,你可以使用与上面类似的方法:只需要defaultParam定义implicit,删除默认值,用隐式列表替换它们,然后{{1}在你打电话的范围内。但是,实际上,不要这样做:它没有增加任何价值,在这种情况下只有缺点。