我有一个对象Foo
object Foo extends RegexParsers{
def apply(s:String): Array[String] = parseAll(record, line) match {
// some logic
}
def record = repsep(mainToken, ",")
// some more code
def unquotes = "[^,]+".r
}
现在,对于逗号分隔的字符串,这是非常硬编码的。
我想基本上修改这个功能,基本上考虑到另一种情况(标签分隔)..
以下代码适用于
object Foo extends RegexParsers{
def apply(s:String): Array[String] = parseAll(record, line) match {
// some logic
}
def record = repsep(mainToken, "\t") // change here
// some more code
def unquotes = "[^\t]+".r // change here
}
只有两处变化......
如何合并这两个更改..我可以将此分隔符作为参数...(默认参数逗号)...然后基于此...执行所需的代码.. ?? 感谢
答案 0 :(得分:2)
您可以使Foo
成为一个类而不是一个对象,并将所需的分隔符作为构造函数参数传递。
class Foo(separator: Char) extends RegexParsers {
def apply(s:String): Array[String] = parseAll(record, line) match {
// some logic
}
def record = repsep(mainToken, separator.toString)
def unquotes = ("[^" + separator + "]+").r
}
然后通过制作适当的实例来使用它:
// Parser that uses comma as the separator
val foo1 = new Foo(',')
// Parser that uses tab as the separator
val foo2 = new Foo('\t')
答案 1 :(得分:1)
只需添加var。
即可获得解决方案这也有效:
object Foo extends RegexParsers{
// make sep a var
var sep : String = ","
def apply(s:String): Array[String] = parseAll(record, line) match {
// some logic
}
def record = repsep(mainToken, sep)
// some more code
def unquotes = ("[^" + sep + "]+").r
}
要更改分隔符,请执行以下操作:
Foo.sep = "\t"
但是请注意,没有添加可变状态,当代码异步或并行运行时,您可能遇到问题。