在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抱怨多个隐式值构造者(这种方式违背了拥有它们的目的)。有没有办法在没有
val
。答案 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}在你打电话的范围内。但是,实际上,不要这样做:它没有增加任何价值,在这种情况下只有缺点。