2015-12-07 24 views
0

在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,但我不得到我真正喜欢的结果,特别是因为斯卡拉抱怨在多个构造函数中有隐式值(这种方式挫败了他们的目的)。有没有办法以一种很好的方式实现这种行为没有

  • 1)迫使用户提供一个分隔符。
  • 2)进入“坏行为”所传递空值,然后确认他们(特别是因为这不会让我的分隔符是在构造一个val
  • 3)创造只是因为我不喜欢另外一种语言关于其中一个小小的事情:)。

回答

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,删除默认值,将其替换为隐式列表,然后在您拨打电话的范围内调用import Foo._。但是,真的,不要这样做:它不会增加任何价值,并且在这种情况下只有缺点。

+0

是的,就像我想的那样,无论如何,我会留下这个问题没有答案,看看有人提出一个更好的主意有什么好的建议或解决方法,如果没有,那么我会接受你的答案。谢谢@迪马 – Ordiel

+0

也许,如果我更好地理解你到底是什么“正在解决”,我也可以想出一个“解决方法”。 你能解释一下你认为需要改进的解决方案吗? (我不太在意被接受的答案,只是试图帮助) – Dima

+0

好吧,我想在构造函数中为一些参数提供一个“责任链”,这样我就可以结束用一个“val”(用java语言中的'public final'变量,包含“分隔符”),我知道我可以通过在构造函数的参数中使用不同的名称,然后将它分配给'val separator'但这并不是对内存和变量的非常聪明的使用,而且我认为在我的参数(在这种情况下是分隔符)中有更好的名称,以便用户可以将它们称为'new TockenizerExample(separator ='/ ',data =“bla”) – Ordiel